656 Stimmen

MySQL-Fehler #1071 - Der angegebene Schlüssel war zu lang; die maximale Schlüssellänge beträgt 767 Bytes

Wenn ich den folgenden Befehl ausführe:

ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);

Ich habe diese Fehlermeldung erhalten:

#1071 - Specified key was too long; max key length is 767 bytes

Informationen über Spalte1 und Spalte2:

column1 varchar(20) utf8_general_ci
column2  varchar(500) utf8_general_ci

でしょう varchar(20) benötigt nur 21 Bytes, während varchar(500) benötigt nur 501 Bytes. Die Gesamtzahl der Bytes beträgt also 522, also weniger als 767. Warum habe ich dann die Fehlermeldung erhalten?

#1071 - Specified key was too long; max key length is 767 bytes

5 Stimmen

Da es sich nicht um 520 Bytes, sondern um 2080 Bytes handelt, die weit über 767 Bytes hinausgehen, könnten Sie Spalte1 varchar(20) und Spalte2 varchar(170) verwenden. Wenn Sie eine Zeichen/Byte-Entsprechung wünschen, verwenden Sie latin1

3 Stimmen

Ich denke, Ihre Berechnung ist ein bisschen falsch hier. mysql verwendet 1 oder 2 zusätzliche Bytes, um die Werte Länge aufzeichnen: 1 Byte, wenn die maximale Länge der Spalte 255 Bytes oder weniger ist, 2, wenn es länger als 255 Bytes ist. die utf8_general_ci Codierung benötigt 3 Bytes pro Zeichen so varchar (20) verwendet 61 Bytes, varchar (500) verwendet 1502 Bytes insgesamt 1563 Bytes

3 Stimmen

Mysql> select maxlen, character_set_name from information_schema.character_sets where character_set_name in('latin1', 'utf8', 'utf8mb4'); maxlen | character_set_name ------ | ------------------- 1 | latin1 ------ | ------------------- 3 | utf8 ------ | ------------------- 4 | utf8mb4

3voto

Cassio Seffrin Punkte 4409

In meinem Fall hatte ich dieses Problem, als ich eine Datenbank mit den Linux-Umleitungszeichen für die Ausgabe/Eingabe sicherte. Deshalb habe ich die Syntax wie unten beschrieben geändert. PS: Sie verwenden ein Linux- oder Mac-Terminal.

Sicherung (ohne die > Umleitung)

# mysqldump -u root -p databasename -r bkp.sql

Wiederherstellen (ohne die < Umleitung )

# mysql -u root -p --default-character-set=utf8 databasename
mysql> SET names 'utf8'
mysql> SOURCE bkp.sql

Die Fehlermeldung "Der angegebene Schlüssel war zu lang; die maximale Schlüssellänge beträgt 767 Bytes" ist einfach verschwunden.

2voto

HoldOffHunger Punkte 14903

Das Problem

In MySQL gibt es eine maximale Schlüssellänge.

  • InnoDB - maximale Schlüssellänge ist 1.536 Bytes (für 8kb Seitengröße) und 768 (für 4kb Seitengröße) (Quelle: Dev.MySQL.de ).
  • MyISAM - maximale Schlüssellänge ist 1.000 Bytes (Quelle Dev.MySQL.de ).

Diese werden gezählt in Bytes! Ein UTF-8-Zeichen kann also mehr als ein Byte benötigen, um im Schlüssel gespeichert zu werden.

Daher gibt es nur zwei unmittelbare Lösungen:

  • Indexiert nur die ersten n-ten Zeichen der Textart.
  • Erstellen einer FULL TEXT search - Alles wird innerhalb des Textes durchsuchbar sein, ähnlich wie bei ElasticSearch

Indizierung der ersten n-ten Zeichen einer Textart

Wenn Sie eine Tabelle erstellen, verwenden Sie die folgende Syntax, um die ersten 255 Zeichen eines Feldes zu indizieren: KEY Irgendein Textschlüssel ( SomeText (255)) . Etwa so:

CREATE TABLE `MyTable` (
    `id` int(11) NOT NULL auto_increment,
    `SomeText` TEXT NOT NULL,
    PRIMARY KEY  (`id`),
    KEY `sometextkey` (`SomeText`(255))
);

Wenn Sie die Tabelle bereits haben, können Sie einen eindeutigen Schlüssel zu einem Feld mit hinzufügen: ADD UNIQUE( ConfigValue (20)); . Etwa so:

ALTER TABLE
MyTable
ADD UNIQUE(`ConfigValue`(20));

Wenn der Name des Feldes nicht reserviert ist MySQL-Schlüsselwort , dann sind die Backticks (````) um den Feldnamen nicht erforderlich.

Erstellen einer FULL TEXT Suche

Eine Volltextsuche ermöglicht es Ihnen, den gesamten Wert Ihrer TEXT Bereich. Es wird ein Ganzwortabgleich durchgeführt, wenn Sie NATURAL LANGUAGE MODE oder Teilwortsuche, wenn Sie einen der anderen Modi verwenden. Weitere Informationen zu den Optionen für Volltext finden Sie hier: Dev.MySQL.de

Erstellen Sie Ihre Tabelle mit dem Text, und fügen Sie den Volltextindex hinzu...

ALTER TABLE
        MyTable
ADD FULLTEXT INDEX
        `SomeTextKey` (`SomeTextField` DESC);

Dann durchsuchen Sie Ihre Tabelle wie folgt...

SELECT
        MyTable.id, MyTable.Title,
MATCH
        (MyTable.Text)
AGAINST
        ('foobar' IN NATURAL LANGUAGE MODE) AS score
FROM
        MyTable
HAVING
        score > 0
ORDER BY
        score DESC;

2voto

neel Punkte 21

Bitte prüfen Sie, ob sql_mode ist wie

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

wenn ja, ändern Sie in

sql_mode=NO_ENGINE_SUBSTITUTION

OR

Starten Sie Ihren Server neu und ändern Sie Ihre my.cnf-Datei (setzen Sie Folgendes ein)

innodb_large_prefix=on

2voto

Rivers Punkte 2062

Aufgrund von Präfixbeschränkungen wird dieser Fehler auftreten. 767 Bytes ist die angegebene Präfixbegrenzung für InnoDB-Tabellen in MySQL-Versionen vor 5.7. Für MyISAM-Tabellen beträgt sie 1.000 Bytes. In MySQL Version 5.7 und höher wurde diese Grenze auf 3072 Bytes erhöht.

Die Ausführung des folgenden Befehls auf dem Dienst, der den Fehler verursacht, sollte Ihr Problem lösen. Dies muss in der MYSQL CLI ausgeführt werden.

SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=on;
SET GLOBAL innodb_large_prefix=on;

1voto

Siwei Punkte 16939

OK, in meiner Situation muss ich eine Datenbankdatei von mySQL 5.7 nach mySQL 5.6 wiederherstellen und bin auf dieses Problem gestoßen.

die Hauptursache ist die Inkompatibilität der Version, und eine Spalte, die indiziert wird, ist länger als 191 (Standardwert ist 255)

Die Lösung ist also ganz einfach: Alle "indizierten Spaltenlängen" müssen eine Zahl kleiner als 191 sein (z. B. 180).

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X