webentwicklung-frage-antwort-db.com.de

Mysql :: Error: Angegebener Schlüssel war zu lang; Die maximale Schlüssellänge beträgt 1000 Byte

script/generate acts_as_taggable_on_migration
rake db:migrate

verursacht

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

Was soll ich machen?

Hier ist meine Datenbankverschlüsselung: 

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

Dies ist nur ein MySQL-Problem -

MySQL hat verschiedene Engines - MyISAM, InnoDB, Memory ...

MySQL hat unterschiedliche Grenzen für den Speicherplatz, den Sie zum Definieren von Indizes für Spalten verwenden können - für MyISAM sind es 1.000 Byte. es ist 767 für InnoDB . Und der Datentyp dieser Spalten ist von Bedeutung - für VARCHAR ist es dreimal so, dass ein Index eines VARCHAR (100) 300 dieser Bytes benötigt (weil 100 Zeichen * 3 = 300).

Um eine gewisse Indizierung zu ermöglichen, wenn Sie den Höchstwert erreichen, können Sie den Index in Bezug auf Teile des Spaltendatentyps definieren:

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

Angenommen, your_column ist VARCHAR (100), wird der Index im obigen Beispiel nur für die ersten 50 Zeichen gelten. Bei der Suche nach Daten, die über das 50. Zeichen hinausgehen, kann der Index nicht verwendet werden.

48
OMG Ponies

Dies scheint ein Fehler zu sein, der hier gemeldet wurde: http://bugs.mysql.com/bug.php?id=4541

Wenn Sie alle Antworten in diesem Beitrag ausprobiert haben und immer noch den Fehler erhalten, möchten Sie möglicherweise versuchen, diesen Befehl in Ihrem SQL-Abfragefenster auszuführen.

set GLOBAL storage_engine='InnoDb';
3
Pabinator

wenn dieser Fehler in bestimmten Prozessen wie der Migration auftritt, kann er durch Ändern der Konfigurationsdatei von MySql (* .ini)

default-storage-engine=InnoDB
1
user3410311

Ich denke, eines Ihrer Felder ist ein Varchar mit mehr als 1000 Zeichen. z.B. Kontext? 

Denken Sie über die Bedeutung eines Index nach. Es ist ein schneller Zugriff auf eine Zeile, wenn sich alle indizierten Felder innerhalb der where-Klausel befinden. Wenn ein Index zu lang ist (bei mysql mehr als 1000 Byte), ist die Verwendung eines Index nicht sinnvoll, da er wahrscheinlich langsamer ist als der Zugriff auf die vollständige Tabelle mit einem vollständigen Tabellenscan.

Ich würde vorschlagen, den Index zu verkürzen, z. B. auf taggable_id und taggable_type, wenn beide einmal kürzer sind.

Prost - Gerhard

0
BitKFu