#1071 - Specified key was too long; max key length is 767 bytes
Wenn ich ausgeführt den folgenden Befehl ein:
ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);
Habe ich diese Fehlermeldung:
#1071 - Specified key was too long; max key length is 767 bytes
Informationen über column1 und column2:
column1 varchar(20) utf8_general_ci
column2 varchar(500) utf8_general_ci
Ich denke varchar(20)
benötigt nur 21 bytes, während varchar(500)
erfordert nur 501 bytes. So ist die Summe der bytes 522, weniger als 767. Also, warum bekomme ich die Fehlermeldung?
#1071 - Specified key was too long; max key length is 767 bytes
Weil es nicht das 520 bytes, sondern, 2080 bytes, die weit über 767 bytes, die Sie tun könnten, spalte1 varchar(20) und spalte2 varchar(170). wenn Sie wollen ein Zeichen/byte-equiv verwenden latin1
ich denke, deine Rechnung ist ein wenig falsch hier. mysql verwendet 1 oder 2 zusätzlichen bytes, die zum aufzeichnen der Werte-Länge: 1 byte, wenn die Spalte, die maximale Länge ist 255 bytes oder weniger ist, 2, wenn es länger als 255 bytes ist. die utf8_general_ci Kodierung benötigt 3 Byte pro Zeichen also vom Datentyp varchar(20) verwendet 61 bytes varchar(500) verwendet 1502 bytes insgesamt 1563 bytes
mysql> select maxlen, character_set_name von information_schema.character_sets, wo character_set_name('latin1', 'utf8', 'utf8mb4'); maxlen | character_set_name ------ | ------------------- 1 | latin1 ------ | ------------------- 3 | utf8 ------ | ------------------- 4 | utf8mb4
'wenn Sie wollen ein Zeichen/byte-equiv verwenden latin1' Bitte nicht. Latin1 wirklich, wirklich saugt. Sie werden es bereuen.
stackoverflow.com/a/41890295/470749 für mich gearbeitet.
ich denke, deine Rechnung ist ein wenig falsch hier. mysql verwendet 1 oder 2 zusätzlichen bytes, die zum aufzeichnen der Werte-Länge: 1 byte, wenn die Spalte, die maximale Länge ist 255 bytes oder weniger ist, 2, wenn es länger als 255 bytes ist. die utf8_general_ci Kodierung benötigt 3 Byte pro Zeichen also vom Datentyp varchar(20) verwendet 61 bytes varchar(500) verwendet 1502 bytes insgesamt 1563 bytes
mysql> select maxlen, character_set_name von information_schema.character_sets, wo character_set_name('latin1', 'utf8', 'utf8mb4'); maxlen | character_set_name ------ | ------------------- 1 | latin1 ------ | ------------------- 3 | utf8 ------ | ------------------- 4 | utf8mb4
'wenn Sie wollen ein Zeichen/byte-equiv verwenden latin1' Bitte nicht. Latin1 wirklich, wirklich saugt. Sie werden es bereuen.
stackoverflow.com/a/41890295/470749 für mich gearbeitet.
InformationsquelleAutor Steven | 2009-11-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
767 bytes ist die angegebene Präfix-Begrenzung für InnoDB-Tabellen in MySQL-version 5.6 (und früheren Versionen). Es sind 1.000 Byte lange für MyISAM-Tabellen. In MySQL-version 5.7 und höher dieses limit wurde erhöht, um 3072 bytes.
Sie müssen sich auch bewusst sein, dass, wenn Sie einen index auf einem großen char-oder varchar-Feld, das utf8mb4 codiert, Sie haben, teilen Sie die max-index-Präfix-Länge von 767 bytes (oder 3072 bytes), die von 4, was in 191. Dies ist, weil die maximale Länge einer utf8mb4 Zeichen vier bytes. Für den utf-8-Zeichen-es wären drei bytes, resultierend in max-index-Präfix-Länge von 254.
Einer option, die Sie haben, nur Platz untere Grenze für Ihre VARCHAR-Felder.
Anderen option (nach dem Antwort zu diesem Thema) ist die Teilmenge der Spalte anstatt den gesamten Betrag, D. H.:
Zwicken, wie Sie benötigen, um die Schlüssel zu beantragen, aber ich Frage mich, ob es wäre Wert, es zu überprüfen Sie Ihre Daten-Modell im Hinblick auf diese Entität zu sehen, ob es Verbesserungen, die erlauben würde, Sie zu implementieren, die den mit Ihr verfolgten wirtschaftlichen Regeln, ohne auf die MySQL-Beschränkung.
Dies erklärt nicht, warum die Felder auch unterhalb der Länge begrenzen, sind die überschreitung der Länge begrenzen...
Ich habe versucht, die Bearbeitung der Informationen @dem Cerin fehlt oben, die eindeutig als vermisst, von anderen als gut, aber es wird abgelehnt, da Sie eher geeignet als Kommentar. Für diejenigen, die versuchen zu verstehen, warum 500 + 20 > 767 siehe Stefan Endrullis' Kommentar auf Julien ' s Antwort.
Dies kann ein problem sein. Zum Beispiel: ich habe Feld name (255) und fügen Sie einzigartig in diesem Bereich ist die Namen(191), wie ich bin mit utf8mb4. Wenn ich mein Benutzer hinzufügen, deren Namen mit 'IJUE3ump5fiUuCi16jSofYS234MLschW4wsiktkibrtpotkbk6vteh5pnuz1tkjy...aO500mlJs' Und die anderen Benutzer hinzufügen, die Ihren Namen mit diesem 'IJUE3ump5fiUuCi16jSofYS234MLschW4wsiktkibrtpotkbk6vteh5pnuz1tkjy...aO500mlJa' Der verschiedenen ist das Letzte Zeichen. Es sollte Gültigkeitsprüfung nicht stecken, auf doppelten Eintrag.
Die index-Grenze ist 767 bytes, nicht in Zeichen. Und da Mysql die
utf8mb4
Zeichensatz (die der rest der Welt fordert utf8) muss (bei den meisten) 4 bytes pro Zeichen Sie können nur die index bis zuVARCHAR(191)
. Mysql istutf8
Zeichensatz (die der rest der Welt fordert gebrochen) muss auf maximal 3 bytes pro Zeichen also, wenn Sie, (die Sie sollte nicht), können Sie den index bis zuVARCHAR(255)
InformationsquelleAutor OMG Ponies
Wenn jemand Probleme mit INNODB /Utf-8 versucht, eine
UNIQUE
index auf einVARCHAR(256)
Feld, schalten Sie es aufVARCHAR(255)
. Es scheint 255 ist die Begrenzung.3*255 = 765 < 767
.Dies ersparte mir eine Menge frustration - danke. Es sollte die akzeptierte Antwort IMO, unter Berücksichtigung der Benutzer ist die Verwendung von InnoDB, indem Sie behaupten, Sie traf ein 767b Einschränkung.
ALS Stefan Endrullis gesagt, es hängt vom charset. Wenn Sie utf-8 verwendet 3 bytes: 255x3=765, die niedriger ist als die 767-Grenze, während 256x3=768, die ist höher. Aber wenn Sie mit UTF8mb4 seine 255*4=1020, so ist das keine wirklich Lösung
Diese Antwort ist richtig. Aber, wenn der Wert 255 in der Tat die Arbeit für Sie bedeutet das, dass Sie Mysql verwenden
utf8
, die leider gebrochen ist. Es können nur Kodieren von Zeichen in der basic multilingual plane. Sie bekommen Probleme mit Zeichen, die außerhalb des Zuständigkeitsbereichs. Zum Beispiel jene, die Emoji-Charaktere, die Sie haben gewesen das hinzufügen fallen, denke ich. Also statt der Umstellung aufVARCHAR(255)
wechselnVARCHAR(191)
und schalten Sie die Kodierung aufutf8mb4
(die eigentlich nur utf8, aber MySql halten wollte, zurück. compat).Nicht hilfreich für meine mehrspaltigen unique-Einschränkung. Es würde auch nicht arbeiten für die OP ' s mehrspaltigen unique-Einschränkung. (geben würde es eine Gesamt Größe von 825 bytes)
InformationsquelleAutor PinkTurtle
Getroffen, wenn Sie die Grenze. Legen Sie die folgenden.
utf8
VARCHAR(255)
utf8mb4
VARCHAR(191)
utf8mb4
begrenzen (welche ist die meist verwendete Kodierung für neuere Datenbanken, wie es akzeptiert emojis/etc).weil 767 / 4 ~= 191 , und 767 / 3 ~= 255
wo und wie einstellen?
Ja, die Angabe
ENGINE=InnoDB DEFAULT CHARSET=utf8
am Ende derCREATE TABLE
Aussage, die ich in der Lage war, eineVARCHAR(255)
Primärschlüssel. Danke.jemand geben ihm +1 auf das limit überschreiten 191 🙂
InformationsquelleAutor Aley
MySQL übernimmt schlimmsten Fall für die Anzahl der bytes pro Zeichen in der Zeichenfolge. Für den MySQL - 'utf8' - Codierung ist, dass die 3 Byte pro Zeichen da, dass die Kodierung nicht erlaubt, die Zeichen über
U+FFFF
. Für den MySQL - 'utf8mb4' encoding, ist es 4 bytes pro Zeichen, da es ist, was ruft MySQL die tatsächlichen UTF-8.Also angenommen, Sie sind mit 'utf8', Ihrem ersten Spalte 60 Byte für den index und die zweite weitere 1500.
Ja, genau,
Ich denke, das könnte die richtige Antwort, aber könntest du näher erläutern, was man hätte tun müssen, zu korrigieren, so ein Problem? Zumindest für MySQL-noobs wie mich?
Es gibt keinen Weg, um diesen index zu begrenzen. Die Frage ist hier, über unique-Einschränkungen; für diese können Sie eine Spalte von text in unbegrenzter Länge, und anderen, wo Sie speichern einen hash (wie MD5), text, und verwenden Sie die hash-Spalte für Ihre unique-Einschränkung. Sie haben, um sicherzustellen, dass Ihr Programm hält die hashes up-to-date, wenn es verändert den text, aber es gibt verschiedene Möglichkeiten, um zu behandeln, ohne zu viel Mühe. Ganz ehrlich, MySQL implementieren sollte eine solche Sache selbst, so dass Sie nicht haben, um, ich würde mich nicht Wundern, wenn MariaDB hat sowas eingebaut.
Einen eindeutigen index auf eine sehr lange varchar-Spalte ist selten. Denken Sie daran, warum Sie brauchen, weil es möglicherweise ein design-Problem. Wenn Sie wollen einfach nur einen index für die Suche, betrachten einige Feld 'keywords', welches innerhalb von 191 Zeichen, oder teilen Sie den text in kurzen Beschreibung und lang/vollständiger text etc. Oder wenn Sie wirklich brauchen, Volltext-Suche, berücksichtigen, die mit Hilfe spezialisierter software, wie Apache Lucene.
InformationsquelleAutor morganwahl
ausführen dieser Abfrage, bevor Sie Ihre Abfrage:
dies erhöht die Grenze
3072 bytes
.Nur gilt bei Verwendung von nicht-standard-Reihe-Formate. Siehe dev.mysql.com/doc/refman/5.5/en/.... Speziell, 'Aktivieren Sie diese option, damit die index-Taste Präfixe mehr als 767 bytes (bis zu 3072 bytes), die für InnoDB-Tabellen verwenden, die die DYNAMISCHE und KOMPRIMIERTE Zeile formatiert.' Die Standard-Zeile-format ist nicht betroffen.
Dies funktionierte gut für mich - mehr details und eine Anleitung finden Sie hier: mechanics.flite.com/blog/2014/07/29/...
Man wundert sich über den Treffer auf Indizierung und lookup, wenn ein key-Feld ist zu groß.
Wichtige fehlende details aus dieser Antwort.
innodb_file_format
mussBARRACUDA
und Am Tisch Ebene, die Sie haben zu verwendenROW_FORMAT=DYNAMIC
oderROW_FORMAT=COMPRESSED
. Siehe @cwd ' s Kommentar oben mit der Anleitung.InformationsquelleAutor Raza Ahmed
Welche Zeichenkodierung benutzt du? Einige Zeichensätze (wie UTF-16, et cetera) mehr als ein byte pro Zeichen.
20 * 4 + 1
bytes, und die 500 char-Spalte ist500 * 4 + 2
bytesFür was es Wert ist, ich hatte gerade das gleiche problem und die Umstellung von utf8_general_ci, utf8_unicode_ci das problem bei mir gelöst. Ich weiß nicht, warum aber 🙁
Für eine
VARCHAR(256)
Spalte mit einemUNIQUE
index, ändern der Sortierung hatte keine Wirkung bei mir, wie bei @Andresch. Die Verringerung der Länge von 256 auf 255 haben, es zu lösen. Ich verstehe nicht, warum 767 / max 4 bytes pro Zeichen ergeben würde maximal 191?255*3 = 765; 256*3 = 768
. Es erscheint Ihre server war asssuming 3 Byte pro Zeichen, @ArjanSie sind richtig, aber dies sollte erarbeitet werden: UTF-8 selbst nutzt 1-4 Byte pro code-point. MySQL ist "character sets" (wirklich Codierungen) hat einen Zeichensatz namens "utf8", die in der Lage ist zu Kodieren, etwas UTF-8, und nutzt 1-3 Byte pro code-point, und unfähig ist, die die Kodierung der code-points außerhalb der BMP. Es enthält auch einen anderen Zeichensatz als "utf8mb4", die 1-4 Byte pro code-point und ist in der Lage Kodierung aller Unicode-code-points. (utf8mb4 ist UTF-8, utf8 ist eine seltsame UTF-8-version.)
InformationsquelleAutor Amber
Lösung Für Laravel Framework
Als pro Laravel 5.4.* Dokumentation; Sie haben, um den Standard-string-Länge im inneren des
boot
Methode derapp/Providers/AppServiceProvider.php
- Datei wie folgt:Erklärung dieses Update, gegeben durch Laravel 5.4.* Dokumentation:
das ist Glück Antwort..ich würde verschwendet haben Stunden, wenn es ist nicht, nicht hier..
Diese Antwort ist Super. Aber weiß jemand, warum genau das funktioniert?
Laravel Dokumentation gibt seine Erklärung in der Rubrik "Index Längen & MySQL / MariaDB" laravel.com/docs/5.4/migrations#creating-indexes
Ich habe aktualisiert die Antwort. Ich habe die Erklärung gegeben, die von laravel Dokumentation für dieses Update.
InformationsquelleAutor alishaukat
UTF8 benötigt 3 Byte pro Zeichen zum speichern der Zeichenfolge, also in deinem Fall 20 + 500 Zeichen = 20*3+500*3 = 1560 bytes, die mehr als erlaubt 767 bytes.
Den Grenzwert für UTF8 ist 767/3 = 255 Zeichen, für UTF8mb4, die verwendet 4 Byte pro Zeichen, es ist 767/4 = 191 Zeichen.
Es gibt zwei Lösungen für dieses problem, wenn Sie verwenden müssen, um mehr Spalte als der Grenzwert:
In meinem Fall brauchte ich hinzufügen Eindeutigen index auf die Spalte, in der SEO-string der Artikel, wie ich nur
[A-z0-9\-]
Zeichen für SEO verwendet habe ichlatin1_general_ci
verwendet nur ein byte pro Zeichen und so Spalte kann 767 Byte Länge.Die andere option war für mich so erstellen Sie eine weitere Spalte, die würde speichern hash-SEO, wird in dieser Spalte hätte
UNIQUE
Schlüssel, um sicherzustellen, SEO-Werte eindeutig sind. Ich würde auchKEY
index, original-SEO-Spalte, um die Geschwindigkeit nach oben schauen.InformationsquelleAutor Buksy
Die Antwort, warum Sie die Fehlermeldung die Nachricht schon beantwortet wurde von vielen Usern hier. Meine Antwort ist über, wie zu reparieren und zu verwenden, wie es werden wird.
Beziehen, von dieser link.
use my_database_name;
set global innodb_large_prefix=on;
set global innodb_file_format=Barracuda;
Das problem von diesem Update ist, wenn Sie exportieren db auf einen anderen server (z.B. von localhost zu echten host), und Sie können nicht MySQL-Kommandozeile in diesem server. Sie es nicht schaffen, dort zu arbeiten.
InformationsquelleAutor vee
Erhielten Sie diese Nachricht, weil 1 byte entspricht 1 Zeichen nur, wenn Sie die
latin-1
- Zeichensatz. Wenn Sieutf8
jedes Zeichen wird als 3 Byte bei der Definition der key-Spalte. Wenn Sieutf8mb4
jedes Zeichen wird als 4 bytes, die bei der Definition der key-Spalte. So müssen Sie multiplizieren Sie Ihre Schlüssel-Feld die Zeichen-Grenze von, 1, 3, oder 4 (in meinem Beispiel) zum ermitteln der Anzahl von bytes, die das key-Feld ist, versuchen zu ermöglichen. Wenn Sie mit uft8mb4, können Sie nur definieren, 191 Zeichen für eine native, InnoDB primary key-Feld. Nur nicht die Verletzung 767 bytes.InformationsquelleAutor Anthony Rutledge
fügen Sie eine Spalte mit dem md5-von long-Spalten
InformationsquelleAutor diyism
Stießen wir auf dieses Problem wenn Sie versuchen, um einen EINDEUTIGEN index auf einem VARCHAR(255) - Feld mit utf8mb4. Während das problem beschrieben ist auch hier schon, ich wollte fügen Sie einige praktische Ratschläge, wie wir erkannt hat und es gelöst.
Wenn mit utf8mb4, Zeichen zählen als 4 bytes, während utf-8, Sie konnte als 3 bytes. InnoDB-Datenbanken haben eine Grenze, die Indizes kann enthalten nur 767 bytes. So bei der Verwendung von utf8, können Sie eine Speicherung von 255 Zeichen (767/3 = 255), aber mit utf8mb4, können Sie nur speichern, 191 Zeichen (767/4 = 191).
Sind Sie absolut in der Lage, hinzufügen reguläre Indizes für
VARCHAR(255)
Felder mit utf8mb4, aber was passiert, ist der index der Größe ist abgeschnitten von 191 Zeichen automatisch - wieunique_key
hier:Ist dies in Ordnung, weil regelmäßige Indizes werden nur verwendet, um zu helfen, MySQL Suche über Ihre Daten schneller. Das ganze Feld nicht indiziert werden müssen.
Also, warum MySQL truncate den index automatisch für regelmäßige Indizes, aber werfen eine explizite Fehlermeldung, wenn Sie versuchen, es zu tun für eindeutige Indizes? Gut, für MySQL in der Lage sein, um herauszufinden, ob der Wert, der eingefügt oder aktualisiert wird ist bereits vorhanden, es muss eigentlich-index den gesamten Wert und nicht nur ein Teil davon.
Am Ende des Tages, wenn Sie möchten, einen eindeutigen index auf ein Feld, wird der gesamte Inhalt des Feldes passen müssen in den index. Für utf8mb4, dies bedeutet eine Reduzierung Ihrer VARCHAR-Feld-Längen von bis zu 191 Zeichen oder weniger. Wenn Sie nicht brauchen, utf8mb4 für die Tabelle oder Feld, können Sie legen Sie es zurück auf utf8 und in der Lage sein, um Ihre 255 Felder Länge.
InformationsquelleAutor maknz
Hier ist meine ursprüngliche Antwort:
Aber es funktioniert nicht für alle Fälle.
Ist es eigentlich ein problem der Verwendung von Indizes für Spalten des Datentyps VARCHAR mit dem Zeichensatz
utf8
(oderutf8mb4
), mit VARCHAR-Spalten, die mehr als eine bestimmte Länge an Zeichen. Im Fall vonutf8mb4
bestimmte Länge 191.Entnehmen Sie bitte den Long-Index in diesem Artikel im Abschnitt weitere Informationen, wie lange die Indizes in MySQL-Datenbank: http://hanoian.com/content/index.php/24-automate-the-converting-a-mysql-database-character-set-to-utf8mb4
Das problem für openmeetings-setup (BTW du meinen Abend gerettet 🙂
InformationsquelleAutor Châu Hồng Lĩnh
Ich habe einige der Suche zu diesem Thema habe endlich einige benutzerdefinierte ändern
Für MySQL workbench Version 6.3.7 Grafische inter-phase verfügbar ist
Für Versionen unter 6.3.7 direct-Optionen sind nicht verfügbar, so müssen Sie gehen mit Eingabeaufforderung
"C:\Program Files\MySQL\MySQL Server 5.7\bin" so Befehl
"cd \"
"cd Program Files\MySQL\MySQL Server 5.7\bin".
mysql -u userName-p databasescheema
Jetzt ist es Passwort des jeweiligen Benutzers.
Geben Sie Kennwort und geben Sie in die mysql-Eingabeaufforderung.
set global innodb_large_prefix=on;
set global innodb_file_format=barracuda;
set global innodb_file_per_table=true;
alter table table_name ROW_FORMAT=DYNAMIC;
wenn ich
set global innodb_default_row_format = DYNAMIC;
sehe ich diese Meldung: ERROR 1193 (HY000): Unknown system variable 'innodb_default_row_format'wie Sie Fehler von der workbench aus zu cmd? Ich habe es von workbench es hat die Möglichkeit direkt.
Ich mache es von CMD, weil ich die option nicht sehen, die in Workbench
Ich sehe das problem das var wurde in v5.7.9 und ich habe v5.6.33 version, danke
InformationsquelleAutor Abhishek
ändern Sie Ihre Sortierung. Sie können utf8_general_ci , unterstützt fast alle
InformationsquelleAutor Nids Barthwal
Ich das Problem behoben mit :
ersetzt mit
alle varchar-die mehr als 200 ersetzen Sie Sie mit 191 oder setzen Sie text.
InformationsquelleAutor flik
5 workarounds:
Die Grenze wurde angehoben, 5.7.7 (MariaDB 10.2.2?). Und es erhöht werden kann, mit der Arbeit, die in 5.6 (10.1).
Wenn Sie auf die Begrenzung, weil der versuchen, zu verwenden Zeichensatz utf8mb4. Führen Sie dann eine der folgenden Optionen (jede hat einen Nachteil) um den Fehler zu vermeiden:
-- http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes
InformationsquelleAutor Rick James
Nur die änderung
utf8mb4
zuutf8
beim erstellen von Tabellen mein problem gelöst. Zum Beispiel:CREATE TABLE ... DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
zuCREATE TABLE ... DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
.InformationsquelleAutor MajidJafari
Basiert auf der Spalte, die unten gegeben werden, die 2-variable string-Spalten sind mit
utf8_general_ci
Sortierung (utf8
charset impliziert ist).In MySQL
utf8
charset verwendet maximal 3 bytes für jedes Zeichen. Also, es würde zuteilen müssen 500*3=1500 Byte, das ist viel größer als die 767 bytes MySQL ermöglicht. Das ist, warum Sie immer diese 1071 Fehler.In anderen Worten, Sie berechnen die Anzahl der Zeichen auf der Grundlage der charset - byte-Darstellung, da nicht jedes charset ist ein single-byte-Darstellung (wie Sie angenommen wird.) I. E.
utf8
in MySQL verwendet bei den meisten 3-byte-pro-Zeichen, 767/3≈255 Zeichen, und fürutf8mb4
eine 4-byte-Darstellung, 767/4≈191 Zeichen.Es ist auch bekannt, dass die MySQL -
InformationsquelleAutor Devy
Für laravel oder 5.6 5.7
Schritte gefolgt
App\Providers\AppServiceProvider.php
.use Illuminate\Support\Facades\Schema;
im top.Schema::defaultStringLength(191);
dass alle, Genießen.
InformationsquelleAutor Manojkiran.A
Fand ich diese Abfrage nützlich, zu erkennen, welche Spalten hatte einen index, die gegen die max Länge:
InformationsquelleAutor Andrew
Überprüfen Sie bitte, ob
sql_mode
ist wiewenn es ist, ändern
ODER
Ihren server neu starten, ändern Ihr my.cnf-Datei (folgenden)
InformationsquelleAutor neel
In meinem Fall hatte ich das problem, wenn ich das sichern einer Datenbank mit dem linux-Umleitung output/input-Zeichen. Daher ändere ich die syntax wie unten beschrieben. PS: mit einem linux-oder mac-terminal.
Backup (ohne die > redirect)
Wiederherstellen (ohne das < redirect )
Den Fehler "Specified key was too long; max key length is 767 bytes" einfach verschwunden.
InformationsquelleAutor Cassio Seffrin
Aufgrund Präfix Einschränkungen dieser Fehler auftreten wird. 767 Byte ist die angegebene Präfix Einschränkung für InnoDB-Tabellen in MySQL-Versionen vor 5.7 . Es sind 1.000 Byte lange für MyISAM-Tabellen. In MySQL-version 5.7 und höher dieses limit wurde erhöht, um 3072 bytes.
Ausführen der folgenden Schritte auf dem service geben Sie den Fehler beheben sollten, Ihr Problem. Dies muss durchgeführt werden in der MYSQL-CLI.
InformationsquelleAutor Rivers
Ändern CHARSET der klagenden index-Feld auf "latin1"
also ALTER TABLE tbl ÄNDERN myfield myfield varchar(600) CHARACTER SET latin1 DEFAULT NULL;
latin1 nimmt ein byte für ein Zeichen anstelle von vier
Das ist das Schlimmste, was zu tun ist. Nie tun.
in meinem Fall auf eine Spalte, die speichert Pfadnamen mit nur hex-Zeichen ... also, das könnte eine Lösung sein für jemanden. es hängt wirklich davon ab, was Sie ablegen möchten...
Ich musste downvote, denn mit latin1 ist keine Lösung in 2016AD. Ich habe immer noch schreckliche Albträume über die Zeit, die wir hatten, um zu konvertieren eine Datenbank von latin1 auf utf8 im Jahr 2007 zurück. Ugh. Nicht schön. An alle.
Ich hatte das gleiche problem auf einem eindeutigen index auf zwei Spalten, in denen ich speichern bitcoin-Adressen und Transaktions-IDs. Diese werden immer in ASCII-Zeichen, also werde ich latin1 auf diese Spalten. Upvoting.
InformationsquelleAutor Stan Holodnak
Wenn Sie so etwas wie:
es sollte so etwas wie
aber Sie brauchen, um zu überprüfen, Einzigartigkeit, dass die Spalte aus dem code oder das hinzufügen einer neuen Spalte als MD5-oder SHA1-Hash des varchar-Spalte
Warum auf Eindeutigkeit zu prüfen programmgesteuert, wenn es native DB-Funktion?
InformationsquelleAutor 10undertiber
Index Längen & MySQL /MariaDB
Laravel nutzt die utf8mb4 Charakter standardmäßig festgelegt, die Unterstützung für die Speicherung "emojis" in der Datenbank. Wenn Sie eine MySQL-version älter als die Version 5.7.7 oder MariaDB, die älter als die Version 10.2.2, müssen Sie manuell konfigurieren Sie die Standard-Länge der Zeichenfolge erzeugt, die durch Migrationen, um für MySQL erstellen von Indizes für Sie. Sie können dies konfigurieren, indem Sie den Aufruf der Schema::defaultStringLength Methode in Ihrem AppServiceProvider:
Alternativ Sie können die innodb_large_prefix option für Ihre Datenbank. Finden Sie in Ihrer Datenbank-Dokumentation für Anweisungen auf, wie man richtig um diese option zu aktivieren.
Referenz Offizielle laravel Dokumentation : https://laravel.com/docs/5.7/migrations
InformationsquelleAutor Mayank Dudakiya
Wenn Sie Sie geändert haben
innodb_log_file_size
vor kurzem, versuchen Sie, die Wiederherstellung des vorherigen Wertes, die gearbeitet.InformationsquelleAutor AnkitK
Sich für mich die Ausgabe von "#1071 - Specified key was too long; max key length is 767 bytes" hab ich gelöst, nach dem ändern der primarykey /uniquekey Kombination durch die Begrenzung der Spalte Größe von 200.
InformationsquelleAutor Abdul
Mein Update auf diese sehr gleiche Frage wurde um eine option einzufügen, als 3. argument: charset
Sonst sequelize würde das erstellen von Tabellen als utf8mb4.
InformationsquelleAutor Luis Azcuaga