UTF-8 è una codifica a lunghezza variabile. Nel caso di UTF-8, ciò significa che la memorizzazione di un punto di codice richiede da uno a quattro byte. Tuttavia, la codifica di MySQL chiamata "utf8" memorizza solo un massimo di tre byte per punto di codice.
Quindi il set di caratteri "utf8" non può memorizzare tutti i punti di codice Unicode: supporta solo l'intervallo da 0x000 a 0xFFFF, che è chiamato "Basic Multilingual Plane". Vedere anche Comparison of Unicode encodings.
Questo è ciò che the MySQL documentation ha da dire in proposito:
Il set di caratteri di nome utf8 utilizza un massimo di tre byte per carattere e contiene solo caratteri BMP. A partire da MySQL 5.5.3, il set di caratteri utf8mb4 utilizza un massimo di quattro byte per carattere supporta i caratteri supplementari:
Per un carattere BMP, utf8 e utf8mb4 hanno caratteristiche identiche stoccaggio: valori stesso codice, stessa codifica, stessa lunghezza
Per un carattere supplementare, utf8 non può memorizzare il carattere a tutti, mentre utf8mb4 richiede quattro byte per memorizzarlo. Poiché utf8 non può memorizzare affatto il personaggio, non hai caratteri supplementari nelle colonne utf8 e non devi preoccuparti di convertire i caratteri o di perdere dati quando aggiorni i dati utf8 dalle vecchie versioni di MySQL.
Quindi, se volete la vostra colonna per supportare i caratteri di stoccaggio situata al di fuori del BMP (e di solito si vuole), come ad esempio emoji, utilizzare "utf8mb4". Vedi anche What are the most common non-BMP Unicode characters in actual use?.
Gli unici casi che ho riscontrato (finora) in cui utf8mb4 era "obbligatorio" sono le emoticon e il cinese. Ci sono alfabeti oscuri che ne hanno bisogno. –
Non dovrebbe essere richiesto per il cinese - il cinese + il coreano + il giapponese dovrebbero essere tutti nel piano multilingue di base che copre 'utf8' di MySQL. Detto questo, non c'è motivo per non usare 'utf8mb4' ora, e in effetti è necessario per tutte le nuove emoji, ad es. – thomasrutter
E 'necessario anche se si utilizza per mantenere password e dati crittografati nel proprio database.Stavo mantenendo la password criptata in mysql usando il normale formato utf8 che mi causava molti problemi con alcune password in modo casuale e molto difficile da debugare, quindi alla fine ho provato ad usare la codifica base64 e risolto il problema temporaneamente. Ma ora conosco la ragione. –