2015-05-06 35 views

risposta

166

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?.

+5

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. –

+16

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

+3

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. –

14

Il set di caratteri utf8mb4 è utile perché al giorno d'oggi abbiamo bisogno di supporto per l'archiviazione non solo di caratteri di lingua ma anche di simboli, emoji appena introdotti e così via.

Una bella lettura su How to support full Unicode in MySQL databases di Mathias Bynens può anche far luce su questo.