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

6voto

Nids Barthwal Punkte 1787

Ändern Sie Ihre Sortierung. Sie können verwenden utf8_allgemein_ci die nahezu alle

0 Stimmen

"Fast" ist ein ziemlich guter Hinweis darauf, dass dies keine langfristige Lösung ist.

6voto

MajidJafari Punkte 851

Einfach ändern utf8mb4 à utf8 beim Erstellen von Tabellen löste mein Problem. Zum Beispiel: CREATE TABLE ... DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; à CREATE TABLE ... DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; .

5voto

Shamal Sabah Punkte 189

Dies hat mein Problem gelöst

ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;

4voto

Devy Punkte 9035

Ausgehend von der nachstehenden Spalte werden diese 2 variablen String-Spalten verwendet utf8_general_ci Zusammenstellung ( utf8 Zeichensatz ist impliziert).

In MySQL, utf8 Zeichensatz verwendet eine Höchstzahl von 3 Bytes für jedes Zeichen. Es müsste also 500*3=1500 Bytes zuweisen, was viel mehr ist als die 767 Bytes, die MySQL erlaubt. Deshalb erhalten Sie die Fehlermeldung 1071.

Mit anderen Worten, Sie müssen die Zeichenzahl auf der Grundlage der Byte-Darstellung des Zeichensatzes berechnen, da nicht jeder Zeichensatz eine Ein-Byte-Darstellung ist (wie Sie angenommen haben). utf8 in MySQL verwendet höchstens 3 Byte pro Zeichen, 767/3255 Zeichen, und für utf8mb4 eine Darstellung von höchstens 4 Byte, 767/4191 Zeichen.

Es ist auch bekannt, dass MySQL

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

3voto

Andrew Punkte 471

Ich fand diese Abfrage nützlich, um festzustellen, welche Spalten einen Index haben, der die maximale Länge verletzt:

SELECT
  c.TABLE_NAME As TableName,
  c.COLUMN_NAME AS ColumnName,
  c.DATA_TYPE AS DataType,
  c.CHARACTER_MAXIMUM_LENGTH AS ColumnLength,
  s.INDEX_NAME AS IndexName
FROM information_schema.COLUMNS AS c
INNER JOIN information_schema.statistics AS s
  ON s.table_name = c.TABLE_NAME
 AND s.COLUMN_NAME = c.COLUMN_NAME 
WHERE c.TABLE_SCHEMA = DATABASE()
  AND c.CHARACTER_MAXIMUM_LENGTH > 191 
  AND c.DATA_TYPE IN ('char', 'varchar', 'text')

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