Mysql2::Error: 指定的键太长;对于只有 87 个 db 字段的表,最大 key 长度为 767 字节

标签 mysql ruby-on-rails ruby ruby-on-rails-4 activerecord

我有包含 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/

相关文章:

mysql - MySQL 查询中的乘法(Joomla、php)

mysql - 根据最后一个条目获取列值(非空)

ruby - 我可以通过方法设置全局值吗?

javascript - 使用 Javascript 解析 vcard

php - 将个性 URL 链接到查询字符串 URL

php - 使所有页面都以不同的 html 结构表示来自不同表的数据

ruby-on-rails - BrowserCMS 和回形针

ruby-on-rails - Capybara - 提交没有按钮的表单

ruby-on-rails - Ruby on rails-将 activeRecord 转换为数组

Ruby IMAP 登录错误异常