在rails中创建迁移并指定字符串时,列长度默认为255.有没有办法设置所有创建的列不指定长度,默认为其他数字?< / p>
一般来说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
编码,当我重新加载架构时,在尝试加载索引时会失败。
答案 0 :(得分:6)
可以强制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
,这样您就可以从那时起简单地加载架构。
答案 1 :(得分:2)
你可以做两件事:
您可以限制索引,因此它只会检查前X个字符:
add_index(:name1, :name2, length: 250)
更改具有不同限制的所有字符串
change_column :table1, :name1, :string, :limit => 250
change_column :table1, :name2, :string, :limit => 250
答案 2 :(得分:0)
在迁移文件中执行此操作非常简单。
create_table :articles do |t|
t.string :title, :null => false
t.text :details, :limit => 3000, :null => false
end