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

Ada*_*dam 3 mysql ruby-on-rails

在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编码,当我重新加载模式时,当他们尝试加载索引时,事情会失败.

inf*_*sed 6

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

ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::NATIVE_DATABASE_TYPES[:string] = {
  name: 'varchar',
  limit: 191
}
Run Code Online (Sandbox Code Playgroud)

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

rake db:drop
rake db:create
rake db:migrate
Run Code Online (Sandbox Code Playgroud)

确保你使用rake db:migrate而不是rake db:schema:load.我们需要强制Rails再次运行所有迁移,因为现有schema.rb已经反映了255的大小.一旦您使用新的默认值运行迁移,您将拥有一个schema.rb使用长度为191 的新的,因此您将能够从那时起简单地加载模式.