Mysql ::错误:指定的密钥太长;最大密钥长度为767字节:CREATE INDEX

时间:2013-11-12 21:52:19

标签: mysql ruby-on-rails ruby rspec

我正在使用rails 2.3.5应用程序,女巫我有这个领域

t.string   "trip_cities",             :limit => 256

这个指数

add_index "bookings", ["trip_cities"], :name => "trip_cities"

当我尝试执行时:

bundle exec rake db:test:load

我收到此错误Mysql::Error: Specified key was too long; max key length is 767 bytes: CREATE INDEX 'trip_cities' ON 'bookings' ('trip_cities'),并且不太清楚如何解决此问题。

5 个答案:

答案 0 :(得分:13)

听起来默认排序规则使用UTF8字符集。

MySQL按字节限制密钥长度,而不是字符。由于MySQL使用的UTF8实现允许每个字符3个字节,因此UTF8列上的键的最大长度是字符中密钥长度的3倍(如果未明确指定,则密钥长度是字段的全长)。

在这种情况下,最大密钥长度为256 * 3,即768。您需要限制密钥的长度或更改列的排序规则。

答案 1 :(得分:7)

如何改变迁移本身:

remove_index "bookings", :name => :trip_cities
add_index "bookings", ["trip_cities"], :name => :trip_cities, :length => { :trip_cities => 255 }

答案 2 :(得分:0)

您应该使用正确的选项重新创建数据库。

This帮助我解决了同样的问题

CREATE DATABASE ${DB} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

答案 3 :(得分:0)

将字符串的长度限制为191个字符,例如:

t.string :project, index: { unique: true }, limit: 191

OR

使用此补丁:https://github.com/rails/rails/issues/9855#issuecomment-390366184

答案 4 :(得分:0)

length的索引中添加schema.rb选项对我有用:

t.index ["your_index", "fields"], name: "index_your_index_fields", unique: true, length: 191

当迁移Rails自动执行此操作时,我注意到了这一点,以为这不是回购所致。我必须在另一台计算机上运行rails schema:load,但无法正常运行,尽管添加上述内容可以解决此问题。

希望能帮助某人。