我使用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`)
经过几个小时和研究的时间,我发现这些解决方案:
1.改变MySQL的可变innodb_large_prefix至真(或ON)
这没有奏效。 我试了一下我的Linux服务器,我的Mac上,甚至在Windows上 - 这是行不通的。
2.猴补丁的ActiveRecord :: SchemaMigration.create_table
我并不需要的version
柱为长255(当它是UTF-8,然后它需要4 * 255 = 1020字节,并且超过767字节为键的MySQL的极限)。 我并不需要它是UTF-8两种,但在数据库中的所有其他表是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
你可以阅读整个文件Github上轨/轨道
于是,我就补充:limit => 100
到t.column
说法,但我没有这个解决方案要么成功。 问题是,当originial已经到位,我不能让这个补丁负荷。 换句话说-的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
在成功加载,但加载原来的ActiveRecord :: SchemaMigration当它被覆盖。
我试图乱用ActiveSupport.on_load(:active_record),但似乎没有任何工作。
有没有一种方法后originial的ActiveRecord :: SchemaMigration到位加载这个文件,这个补丁的工作?
你有什么建议吗? 我可以澄清这个问题的任何部分,如果它是没有意义的你。 尽管问我。 我一直坚持这一太久。