我有包含 87 个 db 列的表的 Rails 模型,但是当我尝试添加任何额外的 db 列时,它失败了
ArbitaryDatum.columns.count
=> 87
ArbitaryDatum.table_name
=> "arbitary_data"
ActiveRecord::Migration.add_column :arbitary_data, :attr51, :string
-- add_column(:arbitary_data, :attr51, :string)
(1.4ms) ALTER TABLE `arbitary_data` ADD `attr51` varchar(255)
Mysql2::Error: Specified key was too long; max key length is 767 bytes: ALTER TABLE `arbitary_data` ADD `attr51` varchar(255)
ActiveRecord::StatementInvalid: Mysql2::Error: Specified key was too long; max key length is 767 bytes: ALTER TABLE `arbitary_data` ADD `attr51` varchar(255)
我检查了我正在使用的 mysql 版本,
mysql --version
mysql Ver 14.14 Distrib 5.5.62, for debian-linux-gnu (i686) using readline 6.3
我不明白为什么它不允许添加额外的表格列
问为什么我没有收到Mysql2::Error: Specified key was too long
最佳答案
MySQL 在 InnoDB 中的前缀限制为 767 字节,在 MYISAM 中为 1000 字节,
不幸的是,没有真正的解决方案。您唯一的选择是减小列的大小、使用不同的字符集(如 UTF-8)或使用不同的引擎(如 MYISAM)。在本例中,我将字符集切换为 UTF-8,从而将最大 key 长度提高到 255 个字符。
在迁移中将字符集设置为 UTF8
reversible do |dir|
dir.up {
ActiveRecord::Migration.add_column :data, :attr51, "VARCHAR(255) CHARACTER SET utf8"
}
end
关于Mysql2::Error: 指定的键太长;对于只有 87 个 db 字段的表,最大 key 长度为 767 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53955427/