Quando ho eseguito il seguente comando
ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);
Ho ricevuto questo messaggio di errore:
#1071 - Specified key was too long; max key length is 767 bytes
Informazioni su column1 e column2:
column1 varchar(20) utf8_general_ci
column2 varchar(500) utf8_general_ci
Penso che varchar(20)
richieda solo 21 byte mentre varchar(500)
richiede solo 501 byte. Quindi i byte totali sono 522, meno di 767. Allora perché ho ricevuto il messaggio di errore?
#1071 - Specified key was too long; max key length is 767 bytes
767 byte è la limitazione dichiarata del prefisso per le tabelle InnoDB in MySQL versione 5.6 (e versioni precedenti). È di 1000 byte per le tabelle MyISAM. In MySQL versione 5.7 e successive questo limite è stato aumentato a 3072 byte.
Dovete anche essere consapevoli che se impostate un indice su un grande campo char o varchar che è codificato utf8mb4, dovete dividere la lunghezza massima del prefisso dell'indice di 767 byte (o 3072 byte) per 4 ottenendo 191. Questo perché la lunghezza massima di un carattere utf8mb4 è di quattro byte. Per un carattere utf8 sarebbe tre byte, risultando in una lunghezza massima del prefisso dell'indice di 254.
Un'opzione che avete è quella di mettere solo un limite inferiore ai vostri campi VARCHAR.
Un'altra opzione (secondo la risposta a questo problema) è quella di ottenere il sottoinsieme della colonna piuttosto che l'intera quantità, cioè:
ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );
Tweak come è necessario per ottenere la chiave da applicare, ma mi chiedo se varrebbe la pena di rivedere il tuo modello di dati per quanto riguarda questa entità per vedere se c'è miglioramenti che ti permetterebbero di implementare le regole di business previste senza colpire la limitazione di MySQL.