首页 > 解决方案 > 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

标签: mysqlruby-on-railsrubyruby-on-rails-4activerecord

解决方案


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

推荐阅读