当您在 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/