当您在 rails 中创建迁移并指定字符串时,默认情况下列长度为 255。有没有办法将创建的所有未指定长度的列设置为默认为其他数字?
一般来说,255 很好,但在我的情况下,我需要将字符串列上的编码切换到 utf8mb4,当我这样做时,索引会中断,因为索引不能超过 767 字节:
Mysql2::Error: Specified key was too long; max key length is 767 bytes
由于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
已经反映了 255 的大小。使用新的默认值运行迁移后,你将有一个使用长度为 191 的新schema.rb
,因此你可以从那时起简单地加载架构。
你可以做两件事:
-
您可以限制索引,因此它将仅检查前 X 个字符:
add_index(:name1, :name2, length: 250)
-
更改所有具有不同限制的字符串
change_column :table1, :name1, :string, :limit => 250
change_column :table1, :name2, :string, :limit => 250
在迁移文件中执行此操作非常简单。
create_table :articles do |t|
t.string :title, :null => false
t.text :details, :limit => 3000, :null => false
end