2016-03-31 5 views
0

Ich habe bereits überprüft, was der Grund für diesen Fehler ist. Daher weiß ich, dass ich das Limit (767 Byte) überschreite, indem ich E-Mail-VARCHAR (320) als UNIQUE-Schlüssel (320 * 3 = 960 Byte) festlegen möchte.Speichern der E-Mail VARCHAR (320) als EINZIGARTIG, # 1071 - Angegebener Schlüssel war zu lang; max Schlüssellänge ist 767

Allerdings verwende ich MySQL als Datenbank und ich muss den E-Mail-Wert als eindeutigen Schlüssel in meiner Anwendung verwenden. Könnten Sie mir bitte sagen, was ich ändern sollte, um dieses Problem zu überwinden?

+0

Sie können nicht. Sie müssen eine zusätzliche Spalte mit einem Hash verwalten, um den Index anzulegen. –

+0

@ ÁlvaroGonzález Könnten Sie bitte Ihre Lösung in einem Tabellenformat schreiben? –

+0

Ist nicht die maximale Länge 254? Siehe https://en.wikipedia.org/wiki/Email_address & http://stackoverflow.com/questions/386294/what-is-the-maximum-length-of-a-valid-email-address – dnoeth

Antwort

1

Erstellen Sie einen eindeutigen Index für die ersten 254 Zeichen oder so:

create unique index idx_t_email on t(email(254)); 

E-Mails kürzer als 254 Zeichen sein sollte.

Nach dieser answer, die längste mögliche E-Mail-Adresse ist 254 Zeichen, so sollte dies in Ordnung sein.

+0

Vielen Dank so für Informationen! –

+0

Warum nicht einen Trigger verwenden, um einen Hash der Mailspalte zu berechnen, dann den Hash als eindeutiges Feld speichern? 'sha1' ist 20 Bytes lang, also kann 'binary (20)' verwendet werden, um es zu halten. Es ist platzsparender und kann auch automatisiert werden. –

1

Angenommen, Sie verwenden MySQL 5.5.14 oder höher, können Sie dieses Problem, indem lösen:

  • Aktivieren des innodb_large_prefix Server
  • Aktivieren innodb_file_format = BARRACUDA
  • Mit ROW_FORMAT=DYNAMIC oder ROW_FORMAT=COMPRESSED
Einstellung

Damit können Sie in InnoDB-Indizes Spalten mit einer Länge von bis zu 3072 Byte einfügen, sodass Ihre 320-Zeichen-Spalte b e in einem eindeutigen Index enthalten.

Lesen Sie mein Blog-Post für weitere Informationen:

http://mechanics.flite.com/blog/2014/07/29/using-innodb-large-prefix-to-avoid-error-1071/