web-dev-qa-db-ja.com

Mysql :: Error:指定されたキーが長すぎました。最大キー長は1000バイトです

script/generate acts_as_taggable_on_migration
rake db:migrate

原因

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`)

私は何をすべきか?

データベースのエンコードは次のとおりです。

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)
24
amaseuk

これは単にMySQLの問題です-

MySQLにはさまざまなエンジンがあります-MyISAM、InnoDB、Memory ...

MySQLには、列のインデックスを定義するために使用できるスペースの量に異なる制限があります-MyISAMの場合は1,000バイト、InnoDBの場合は767です 。そして、それらの列のデータ型は重要です-VARCHARの場合は3倍なので、VARCHAR(100)のインデックスはこれらのバイトのうち300バイトを取ります(100文字* 3 = 300のため)。

上限値に達したときにいくつかのインデックス付けに対応するために、列データ型の部分に関してインデックスを定義できます。

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

仮定して your_columnはVARCHAR(100)であり、上記の例のインデックスは最初の50文字のみになります。 50文字を超えるデータを検索すると、インデックスを使用できません。

50
OMG Ponies

これはここで報告されたバグのようです: http://bugs.mysql.com/bug.php?id=4541

この投稿のすべての回答を試してもエラーが表示される場合は、SQLクエリウィンドウでこのコマンドを実行してみてください。

set GLOBAL storage_engine='InnoDb';
3
Pabinator

このエラーが移行などのプロセスで発生した場合、MySql(* .ini)の設定ファイルを変更することで解決できます。

default-storage-engine=InnoDB
2
user3410311

あなたのフィールドの1つは1000文字以上のvarcharだと思います。例えば環境?

インデックスの意味について考えてください。すべてのインデックス付きフィールドがwhere句内にある場合、行にすばやくアクセスできます。インデックスが長すぎる場合(mysqlが1000バイトを超える場合)、インデックスを使用しても意味がありません。おそらく、テーブル全体をスキャンして完全なテーブルにアクセスするよりも時間がかかるためです。

Taggable_idとtaggable_typeの両方が一度短い場合は、インデックスを短くすることをお勧めします。

乾杯-ゲルハルト

0
BitKFu