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

ama*_*euk 25 mysql sql indexing ruby-on-rails mysql-error-1071

script/generate acts_as_taggable_on_migration
rake db:migrate
Run Code Online (Sandbox Code Playgroud)

原因

Mysql::Error: Specified key was too long; max key length is 1000 bytes: CREATE  INDEX `index_taggings_on_taggable_id_and_taggable_type_and_context` ON `taggings` (`taggable_id`, `taggable_type`, `context`)
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

这是我的数据库编码:

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 | 
| character_set_connection | latin1 | 
| character_set_database   | utf8   | 
| character_set_filesystem | binary | 
| character_set_results    | latin1 | 
| character_set_server     | latin1 | 
| character_set_system     | utf8   | 
+--------------------------+--------+
7 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 50

这只是一个MySQL问题 -

MySQL有不同的引擎 - MyISAM,InnoDB,Memory ......

MySQL对用于在列上定义索引的空间量有不同的限制 - 对于MyISAM,它是1,000字节; 这是InnoDB的767.并且这些列的数据类型很重要 - 对于VARCHAR,它是3x,因此VARCHAR(100)上的索引将占用300个这些字节(因为100个字符*3 = 300).

要在达到上限值时容纳某些索引,可以定义与列数据类型部分相关的索引:

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))
Run Code Online (Sandbox Code Playgroud)

假设它VARCHAR是VARCHAR(100),上面示例中的索引将仅在前50个字符上.搜索超过第50个字符的数据将无法使用索引.

  • 通过将默认引擎从MyISAM更改为InnoDB来解决.谢谢. (3认同)
  • “通过将默认引擎从 MyISAM 更改为 InnoDB 来解决。” 听起来不可能,因为 InnoDB 实际上只是有一个更短的限制。 (3认同)
  • 你知道一种不会导致上述错误的MySQL引擎吗? (2认同)