27
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)
4

4 に答える 4

55

これはMySQLの問題にすぎません-

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

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

上限値に達したときにインデックスを作成するために、列のデータ型の一部に関してインデックスを定義できます。

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

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

于 2010-08-15T21:24:06.527 に答える
3

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

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

set GLOBAL storage_engine='InnoDb';
于 2015-07-17T18:25:16.513 に答える
2

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

default-storage-engine=InnoDB
于 2015-10-12T10:12:40.650 に答える
0

あなたのフィールドの 1 つが 1000 文字を超える varchar だと思います。例えば文脈?

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

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

乾杯 - ゲルハルト

于 2010-08-15T20:29:25.040 に答える