我正在使用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')
,并且不太清楚如何解决此问题。
答案 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
,但无法正常运行,尽管添加上述内容可以解决此问题。
希望能帮助某人。