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

时间:2015-04-16 19:43:37

标签: mysql ruby-on-rails

在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编码,当我重新加载架构时,在尝试加载索引时会失败。

3 个答案:

答案 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)

你可以做两件事:

  1. 您可以限制索引,因此它只会检查前X个字符:

    add_index(:name1, :name2, length: 250)

  2. 更改具有不同限制的所有字符串

    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