1. Introduzione
MySQL ha aggiunto questa codifica utf8mb4 dopo la 5.5.3, il che significa la maggior parte dei bytes 4, ed è specificamente usato per essere compatibile con unicode a quattro byte. Fortunatamente, utf8mb4 è un superset di utf8, e non è necessaria altra conversione se non cambiare la codifica in utf8mb4. Ovviamente, per risparmiare spazio, generalmente basta usare utf8.
2. Descrizione del contenuto
Come detto sopra, dato che utf8 può salvare la maggior parte dei caratteri cinesi, perché usare utf8mb4? La lunghezza massima del carattere della codifica UTF8 supportata da MySQL è di 3 byte, e se incontri un carattere ampio di 4 byte, inserirai un'eccezione. Il carattere Unicode massimo codificato da UTF-8 di tre byte è 0xffff, che è il piano multilingue base (BMP) in Unicode. Cioè, qualsiasi carattere Unicode che non sia nel piano multitesto base non può essere memorizzato utilizzando il set di caratteri utf8 di Mysql. Questi includono emoji (Emoji è una codifica Unicode speciale comunemente presente su telefoni iOS e Android), molti caratteri cinesi poco comuni, oltre a nuovi caratteri Unicode, e altro ancora.
3. La causa principale del problema
Il formato originale UTF-8 utilizzava da uno a sei byte e poteva codificare fino a 31 caratteri. L'ultima specifica UTF-8 utilizza solo da uno a quattro byte e può codificare fino a 21 bit, che rappresenta esattamente tutti i 17 piani Unicode. UTF8 è un set di caratteri in MySQL che supporta solo caratteri UTF-8 fino a tre byte, che è il piano multi-testo base in Unicode.
Perché UTF8 in MySQL supporta solo i caratteri UTF-8 con un massimo di tre byte? Ci ho pensato, forse perché quando Mysql è stato sviluppato per la prima volta, Unicode non aveva un piano ausiliario. All'epoca, il Comitato Unicode sognava ancora "65.535 caratteri sono sufficienti per il mondo intero". Le lunghezze delle stringhe in Mysql contano i caratteri invece che i byte, e per i tipi di dati CHAR le stringhe devono essere sufficientemente lunghe. Quando si utilizza il set di caratteri utf8, la lunghezza da preservare è la lunghezza più lunga del carattere utf8 moltiplicata per la stringa, quindi è naturale limitare la lunghezza massima utf8 a 3, ad esempio, CHAR(100) Mysql manterrà 300 byte. Per quanto riguarda il motivo per cui le versioni successive non supportano i caratteri UTF-8 da 4 byte, penso che una sia per motivi di retrocompatibilità, e l'altra è che i caratteri al di fuori del piano multilingue base sono raramente usati.
Per salvare caratteri UTF-8 da 4 byte in Mysql, è necessario il set di caratteri utf8mb4, ma è supportato solo dopo la versione 5.5.3 (vedi versione: select version(); )。 Penso che per una migliore compatibilità dovresti sempre usare utf8mb4 invece di utf8. Per i dati di tipo CHAR, utf8mb4 occupa più spazio e, secondo la raccomandazione ufficiale di Mysql, usa VARCHAR invece di CHAR.
|