Abbiamo riscontrato questo problema durante il tentativo di aggiungere un indice UNIQUE a un campo VARCHAR (255) utilizzando utf8mb4. Mentre il problema è già ben delineato qui, volevo aggiungere alcuni consigli pratici su come lo abbiamo capito e risolto.
Quando si utilizza utf8mb4, i caratteri contano come 4 byte, mentre in utf8 potrebbero essere come 3 byte. I database InnoDB hanno un limite che gli indici possono contenere solo 767 byte. Pertanto, quando si utilizza utf8, è possibile memorizzare 255 caratteri (767/3 = 255), ma utilizzando utf8mb4, è possibile memorizzare solo 191 caratteri (767/4 = 191).
Sei assolutamente in grado di aggiungere indici regolari per i VARCHAR(255)
campi utilizzando utf8mb4, ma ciò che accade è che la dimensione dell'indice viene automaticamente troncata a 191 caratteri, come unique_key
qui:
Questo va bene, perché gli indici regolari vengono utilizzati solo per aiutare MySQL a cercare più rapidamente i dati. Non è necessario indicizzare l'intero campo.
Quindi, perché MySQL tronca automaticamente l'indice per gli indici regolari, ma genera un errore esplicito quando si tenta di farlo per indici univoci? Bene, affinché MySQL sia in grado di capire se il valore inserito o aggiornato esiste già, deve effettivamente indicizzare l'intero valore e non solo una parte di esso.
Alla fine della giornata, se si desidera avere un indice univoco su un campo, l'intero contenuto del campo deve rientrare nell'indice. Per utf8mb4, ciò significa ridurre la lunghezza del campo VARCHAR a 191 caratteri o meno. Se non hai bisogno di utf8mb4 per quella tabella o quel campo, puoi riportarlo su utf8 ed essere in grado di mantenere i tuoi 255 campi di lunghezza.