创建schema_migrations的Rails - Mysql2 ::错误:指定的键太长了

Luk*_*oda 7 mysql activerecord ruby-on-rails rails-migrations

我正在使用Rails 3.2.6和Mysql 6.0.9(但我在MySQL 5.2.25上有完全相同的错误)

当我创建新的数据库(rake db:create)然后当我尝试加载模式(rake schema:load)时,我收到此错误:

Mysql2::Error: Specified key was too long; max key length is 767 bytes: CREATE UNIQUE INDEX `unique_schema_migrations` ON `schema_migrations` (`version`)
Run Code Online (Sandbox Code Playgroud)

经过几个小时的研究,我找到了以下解决方案:

1.将MySQL变量innodb_large_prefix更改为true(或ON)

这没用.我在我的Linux服务器,我的Mac甚至Windows上试过它 - 它只是不起作用.

2. Monkeypatch ActiveRecord :: SchemaMigration.create_table

我不需要version列长为255(当它是UTF-8时,它需要4*255 = 1020字节并且超过了密钥的767字节的MySQL限制).我也不需要它是UTF-8,但DB中的所有其他表都是UTF-8,我已将utf8_czech_ci设置为默认排序规则.

实际创建schema_migrations表的方法如下所示:

def self.create_table
  unless connection.table_exists?(table_name)
    connection.create_table(table_name, :id => false) do |t|
      t.column :version, :string, :null => false
    end
    connection.add_index table_name, :version, :unique => true, :name => index_name
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以在Github rails/rails上读取整个文件

所以我试着添加:limit => 100t.column声明中,但我也没有成功使用这个解决方案.问题是,当原始版本已经存在时,我无法进行此补丁加载.换句话说 - 我的补丁 ActiveRecord :: SchemaMigration 之前加载,因此被覆盖.

当我把它放入config/initializers/patches/schema_migration.rb:

require 'active_record/scoping/default'
require 'active_record/scoping/named'
require 'active_record/base'

module ActiveRecord
  class SchemaMigration < ActiveRecord::Base
    def self.create_table
      unless connection.table_exists?(table_name)
        connection.create_table(table_name, :id => false) do |t|
          t.column :version, :string, :null => false, :limit => 100
        end
        connection.add_index table_name, :version, :unique => true, :name => index_name
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

它已成功加载,但在加载原始ActiveRecord :: SchemaMigration时会覆盖它.

我试图搞砸ActiveSupport.on_load(:active_record),但这似乎也不起作用.

有没有办法在原始的ActiveRecord :: SchemaMigration到位后加载这个文件并使这个补丁工作?

你有什么建议吗?如果对你没有任何意义,我可以澄清这个问题的任何部分.尽管问我.我已经坚持了这么久.

dpa*_*dpa 8

767键应该工作.确保使用utf8编码,而不是utf16.我有同样的问题,我的错误是我意外地创建了utf16数据库

  • 此错误是由对数据库使用`utf8mb4`编码引起的,该编码专门用于允许表情符号和其他utf8字符.你提供的是回到`utf8`而不支持扩展unicode. (6认同)
  • 在database.yml中添加>>"encoding:utf8" (2认同)

小智 5

我建议您删除数据库并按照以下说明重新创建一个新数据库:

 mysql -u root -p -e "CREATE DATABASE {DB_NAME} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;"
Run Code Online (Sandbox Code Playgroud)