1. Introduksjon
MySQL la til denne utf8mb4-kodingen etter 5.5.3, som betyr de fleste bytes 4, og den brukes spesifikt for å være kompatibel med fire-byte unicode. Heldigvis er utf8mb4 en supermengde av utf8, og ingen annen konvertering er nødvendig enn å endre kodingen til utf8mb4. Selvfølgelig, for å spare plass, er det som regel nok å bruke utf8.
2. Innholdsbeskrivelse
Som nevnt ovenfor, siden utf8 kan lagre de fleste kinesiske tegn, hvorfor bruke utf8mb4? Maksimal tegnlengde for UTF8-koding støttet av MySQL er 3 byte, og hvis du møter et bredt tegn på 4 byte, vil du sette inn et unntak. Det maksimale Unicode-tegnet kodet av UTF-8 på tre byte er 0xffff, som er det grunnleggende flerspråklige planet (BMP) i Unicode. Det vil si at ethvert Unicode-tegn som ikke er i det grunnleggende multitekstplanet ikke kan lagres ved hjelp av Mysqls utf8-tegnsett. Disse inkluderer emojier (Emoji er en spesiell Unicode-koding som ofte finnes på iOS- og Android-telefoner), og mange uvanlig brukte kinesiske tegn, samt eventuelle nye Unicode-tegn, og mer.
3. Den grunnleggende årsaken til problemet
Det opprinnelige UTF-8-formatet brukte én til seks byte og kunne kode opptil 31 tegn. Den nyeste UTF-8-spesifikasjonen bruker bare én til fire byte og kan kode opptil 21 biter, som er nøyaktig det som representerer alle 17 Unicode-plan. utf8 er et tegnsett i Mysql som kun støtter UTF-8-tegn opptil tre byte lange, som er det grunnleggende flertekstplanet i Unicode.
Hvorfor støtter UTF8 i Mysql bare UTF-8-tegn med maksimalt tre byte? Jeg tenkte på det, kanskje fordi da Mysql først ble utviklet, hadde ikke Unicode et hjelpeplan. På den tiden drømte Unicode-komiteen fortsatt om at «65 535 tegn er nok for hele verden». Strenglengder i Mysql teller tegn i stedet for bytes, og for CHAR-datatyper må strengene være lange nok. Når man bruker utf8-tegnsettet, er lengden som må bevares den lengste tegnlengden på utf8 multiplisert med strenglengden, så det er naturlig å begrense maksimal utf8-lengde til 3, for eksempel vil CHAR(100) Mysql beholde 300 byte. Når det gjelder hvorfor senere versjoner ikke støtter 4-byte UTF-8-tegn, tror jeg det ene er av bakoverkompatibilitetsgrunner, og det andre er at tegn utenfor det grunnleggende flerspråklige planet sjelden brukes.
For å lagre 4-byte UTF-8-tegn i Mysql kreves utf8mb4-tegnsettet, men det støttes kun etter versjon 5.5.3 (se versjon: velg versjon(); )。 Jeg mener at for bedre kompatibilitet bør du alltid bruke utf8mb4 i stedet for utf8. For CHAR-type data bruker utf8mb4 mer plass, og ifølge den offisielle Mysql-anbefalingen, bruk VARCHAR i stedet for CHAR.
|