15

我正在使用 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')并且不太清楚如何解决此问题。

4

5 回答 5

14

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

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

在这种情况下,最大密钥长度将256 * 3768. 您需要限制键的长度或更改列的排序规则。

于 2013-11-12T22:04:10.303 回答
9

如何更改迁移本身:

remove_index "bookings", :name => :trip_cities
add_index "bookings", ["trip_cities"], :name => :trip_cities, :length => { :trip_cities => 255 }
于 2013-11-12T21:58:32.093 回答
5

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

对我有同样的问题有帮助

CREATE DATABASE ${DB} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
于 2018-09-02T00:56:47.950 回答
0

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

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

或者

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

于 2019-04-21T10:38:50.357 回答
0

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

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

我注意到迁移 Rails 时会自动执行此操作,并认为这并未提交给 repo。我不得不rails schema:load在另一台机器上运行,但它无法正常工作,尽管添加上述内容解决了这个问题。

希望对某人有所帮助。

于 2019-07-22T10:02:51.727 回答