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

2019-07-30 14:20发布

我使用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 => 100t.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到位加载这个文件,这个补丁的工作?

你有什么建议吗? 我可以澄清这个问题的任何部分,如果它是没有意义的你。 尽管问我。 我一直坚持这一太久。

Answer 1:

767键应该工作。 请确保您使用utf8编码,而不是utf16 。 我有同样的问题,我的错误是,我无意中创建utf16数据库



Answer 2:

我建议你放弃你的数据库并重新创建一个新的具有以下说明:

 mysql -u root -p -e "CREATE DATABASE {DB_NAME} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;"


Answer 3:

我一直这个错误,当它不是这样的错误:

Mysql2 ::错误:指定的键过长; 最大密钥长度为767个字节:

正是这等:

Mysql2 ::错误:指定的键过长; 最大的密钥长度是3072个字节

所以我的建议在这里我创建使用泊坞窗和MySQL官方此设置一个新的数据库

docker run -p 3306:3306 --name mysql-name -e MYSQL_ROOT_PASSWORD=name -d mysql:5.6 --innodb-large-prefix=1 --innodb-file-format=barracuda --innodb-file-per-table=1

这里的inportant的不是泊坞窗是数据库AHS TEH配置

InnoDB的大型前缀=真正的InnoDB文件格式=梭鱼InnoDB的文件,每个表=真

最后如下变化UTF8 latin1保证sswedish的database.yml的是,因为在服务器中,我看到:

development:
  host: 192.168.99.100
  database: name
  username: root
  password: root
  adapter: mysql2
  charset: latin1
  encoding: latin1
  collation: latin1_swedish_ci


test:
  host: 192.168.99.100
  database: name_test
  username: root
  password: root
  adapter: mysql2
  charset: latin1
  encoding: latin1
  collation: latin1_swedish_ci

production:
  host: 192.168.99.100
  database: name
  username: root
  password: root
  adapter: mysql2
  charset: latin1
  encoding: latin1
  collation: latin1_swedish_ci

之后的作品

bundle exec rake db:create
bundle exec rake db:migrate

我与猴子补丁做到了,没有猴子补丁建议在这里和它的工作原理

config/initializers/ar_innodb_row_format.rb

ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters   
    class AbstractMysqlAdapter 
      def create_table_with_innodb_row_format(table_name, options = {}) 
        table_options = options.reverse_merge(:options => 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')

        create_table_without_innodb_row_format(table_name, table_options) do |td|
         yield td if block_given? 
        end
      end
      alias_method_chain :create_table, :innodb_row_format 
    end
  end
end


文章来源: Rails creating schema_migrations - Mysql2::Error: Specified key was too long