Mysql::Error: Specified key was too long; max key length is 1000 bytes
indexing, mysql, mysql-error-1071, ruby-on-rails, sql
Solution
This is solely a MySQL issue -
MySQL has different engines - MyISAM, InnoDB, Memory...
MySQL has different limits on the amount of space you can use to define indexes on column(s) - for MyISAM it's 1,000 bytes; it's 767 for InnoDB. And the data type of those columns matters - for `VARCHAR`, it's 3x so an index on a `VARCHAR(100)` will take 300 of those bytes (because 100 characters * 3 = 300).
To accommodate some indexing when you hit the ceiling value, you can define the index with regard to portions of the column data type:
CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))
Assuming that `your_column` is `VARCHAR(100)`, the index in the example above will only be on the first 50 characters. Searching for data beyond the 50th character will not be able to use the index.
Problem
``` script/generate acts_as_taggable_on_migration rake db:migrate ``` causes ``` 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`) ``` What should I do? Here is my database encoding: ``` 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) ```