mysql - 如何更改所有已创建列的默认字符串长度 (varchar)?

标签 mysql ruby-on-rails

当您在 Rails 中创建迁移并指定字符串时,默认情况下,列长度为 255。有没有办法将创建的所有未指定长度的列设置为默认为其他数字?

一般来说 255 没问题,但在我的情况下,我需要将字符串列的编码切换为 utf8mb4,当我这样做时,索引会中断,因为索引不能超过 767 字节:

Mysql2::错误:指定的键太长;最大 key 长度为 767 字节

因为 utf8 存储为 3 个字节,所以 3 * 255 = 765,但是 utf8mb4 是 4 个字节,所以 4 * 255 = 1020,这将失败。

因此,一旦我将 database.yml 更改为使用 utf8mb4 编码,当我重新加载模式时,当他们尝试加载索引时,事情就会失败。

最佳答案

可以强制 Rails 为 varchar 列使用 191 的长度。首先,创建一个初始化程序,您将在其中覆盖默认的 varchar 长度。我在 config/initializers/schema_string_limit.rb 中创建了我的:

ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::NATIVE_DATABASE_TYPES[:string] = {
  name: 'varchar',
  limit: 191
}

现在重新创建您的数据库并运行所有迁移:

rake db:drop
rake db:create
rake db:migrate

确保使用 rake db:migrate 而不是 rake db:schema:load。我们需要强制 Rails 再次运行所有迁移,因为现有的 schema.rb 已经反射(reflect)了 255 大小。使用新默认值完成迁移后,您将拥有一个新的 schema.rb,它使用 191 的长度,因此您可以从那时起简单地加载架构。

关于mysql - 如何更改所有已创建列的默认字符串长度 (varchar)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29684532/

相关文章:

mysql - 在 MySql 中执行查询时与 only_full_group_by 相关的错误

mysql - 尝试在 MySQL 中执行删除时出现错误 1093

ruby-on-rails - 用Minimagick替换Rmagick后,出现 'identify.im6: no decode delegate for this image format'错误

ruby-on-rails - rails : How can I let my users choose a design?

ruby-on-rails - Ruby on Rails - 货币 : commas causing an issue

javascript - Node.js 聊天框 - 从数据库加载最后几条消息

mysql - 通过 Kafka 和 Spark 消费大数据

php - 对新项目和编辑项目使用 REPLACE INTO?

ruby-on-rails - Ruby on Rails 分页 : Sort order not respected (will_paginate gem)

ruby-on-rails - 每次运行测试时,Rspec 和 Capybara 都会抛出不一致的 Postgresql 错误