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

1voto

rkok Punkte 851

Meine eigene Lösung für dieses Problem war etwas einfacher und weniger gefährlich als die Verringerung der VARCHAR-Größe von Tabellen.

Situation : Ein CentOS 7 Server mit Plesk Obsidian 18.0.37 und MariaDB 5.5. Ich habe versucht, einen MySQL-Dump von einem Server mit MariaDB 10.1 zu importieren.

Lösung : Aktualisieren von MariaDB 5.5 auf 10.6.

Die Schritte basierten in etwa auf dieser Leitfaden y diese :

  1. mysqldump -u admin -p`cat /etc/psa/.psa.shadow` --all-databases --routines --triggers > /root/all-databases.sql

  2. systemctl stop mariadb

  3. cp -a /var/lib/mysql/ /var/lib/mysql_backup

  4. Konfigurieren Sie die MariaDB-Repositories gemäß der offizielle Leitfaden
    Stellen Sie sicher, dass Sie die Mindestanforderungen von Plesk erfüllen. aquí

  5. yum install MariaDB-client MariaDB-server MariaDB-compat MariaDB-shared

  6. systemctl start mariadb
    In meinem Fall konnte der Server nicht gestartet werden und es trat ein Fehler auf: "Server kann nicht gestartet werden: Bindung an TCP/IP-Port. Fehler erhalten: 22: Ungültiges Argument".
    Die Lösung bestand darin, die bind-address wie folgt in /etc/my.cnf und führen Sie den Befehl erneut aus:

    [mysqld]
    # OLD (broken)
    #bind-address = ::ffff:127.0.0.1
    # NEW
    bind-address = 127.0.0.1
  7. MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql_upgrade -uadmin

  8. plesk sbin packagemng -sdf

  9. rm -f /etc/init.d/mysql

  10. systemctl daemon-reload

1voto

Khushi Punkte 105

Ich habe von varchar auf nvarchar umgestellt, das funktioniert bei mir.

0voto

10undertiber Punkte 1

Wenn Sie etwas erstellen wie:

CREATE TABLE IF NOT EXISTS your_table (
  id int(7) UNSIGNED NOT NULL AUTO_INCREMENT,
  name varchar(256) COLLATE utf8mb4_bin NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY name (name)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ROW_FORMAT=FIXED;

sollte es etwa so lauten

CREATE TABLE IF NOT EXISTS your_table (
      id int(7) UNSIGNED NOT NULL AUTO_INCREMENT,
      name varchar(256) COLLATE utf8mb4_bin NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ROW_FORMAT=FIXED;

aber Sie müssen die Eindeutigkeit dieser Spalte anhand von Code überprüfen oder eine neue Spalte als MD5 oder SHA1 der varchar-Spalte hinzufügen

3 Stimmen

Dann geht Ihr einzigartiger Schlüssel verloren. Ich denke, der bessere Weg ist, einfach die Länge des Namens auf 191 zu reduzieren.

1 Stimmen

Warum programmatisch auf Einzigartigkeit prüfen, wenn es native DB-Funktion ist?

-1voto

Abdul Punkte 11

Bei mir wurde das Problem "#1071 - Der angegebene Schlüssel war zu lang; die maximale Schlüssellänge beträgt 767 Byte" gelöst, nachdem ich die Kombination aus Primärschlüssel und eindeutigem Schlüssel geändert hatte, indem ich die Spaltengröße auf 200 begrenzte.

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

0 Stimmen

Können Sie erklären, woher die Zahl 200 kommt, wenn andere Antworten eine niedrigere Zahl wie 191 enthalten?

-2voto

Luis Azcuaga Punkte 41

Ich habe dieses Problem gelöst, indem ich eine Option als drittes Argument hinzugefügt habe: Zeichensatz

queryInterface.createTable(
  tableName,
  { /*... columns*/ },
  { charset: 'utf8' } 
)

Andernfalls würde sequelize Tabellen erstellen als utf8mb4 .

0 Stimmen

Gibt es ein Problem bei der Verwendung von utf8mb4 ?

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