mysql - Mysql2::Error: 指定的键太长;对于只有 87 db 字段的表,最大密钥长度为 767 字节
问题描述
我有带有 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 字节,在 MISAM 中为 1000 字节,
不幸的是,没有真正的解决方案。您唯一的选择是减小列的大小、使用不同的字符集(如 UTF-8)或使用不同的引擎(如 MYISAM)。在这种情况下,我将字符集切换为 UTF-8,从而将最大密钥长度提高到 255 个字符。
在迁移中将字符集设置为 UTF8
reversible do |dir|
dir.up {
ActiveRecord::Migration.add_column :data, :attr51, "VARCHAR(255) CHARACTER SET utf8"
}
end
推荐阅读
- drupal - 如何将内容查看为 Drupal 8 视图的翻译
- c++ - 从排序数组中删除重复项,不同代码方式的相同解决方案具有不同的输出
- c# - C# MongoDB 加入集合并包含过滤器
- r - R面板数据集查找所有时变变量
- c++ - POCO 等 C++ 库如何访问网络?
- flutter - Flutter:onRefresh 回调返回 null
- docker - Azure 管道从错误的 Dockerfile 构建映像
- node.js - 使用 Knex 连接到服务器,如何解决错误未处理的拒绝错误:密码验证失败
- grafana - Unable to run Grafana server on local system
- python - Keras:过拟合模型?