1. Introduktion
MySQL tilføjede denne utf8mb4-kodning efter 5.5.3, hvilket betyder de fleste bytes 4, og den bruges specifikt til at være kompatibel med fire-byte unicode. Heldigvis er utf8mb4 en supermængde af utf8, og ingen anden konvertering er nødvendig end at ændre kodningen til utf8mb4. Selvfølgelig er det som regel nok at bruge utf8 for at spare plads.
2. Indholdsbeskrivelse
Som nævnt ovenfor, da utf8 kan gemme de fleste kinesiske tegn, hvorfor så bruge utf8mb4? Den maksimale tegnlængde for UTF8-kodning, som MySQL understøtter, er 3 bytes, og hvis du støder på et bredt tegn på 4 bytes, indsætter du en undtagelse. Det maksimale Unicode-tegn, der kodes af UTF-8 på tre bytes, er 0xffff, hvilket er det grundlæggende flersprogede plan (BMP) i Unicode. Det vil sige, at ethvert Unicode-tegn, der ikke er i det grundlæggende multitekstplan, ikke kan gemmes ved hjælp af Mysqls utf8-tegnsæt. Disse inkluderer emojis (Emoji er en særlig Unicode-kodning, der ofte findes på iOS- og Android-telefoner), samt mange usædvanlige kinesiske tegn, samt eventuelle nye Unicode-tegn og mere.
3. Rodårsagen til problemet
Det oprindelige UTF-8-format brugte én til seks bytes og kunne kode op til 31 tegn. Den nyeste UTF-8-specifikation bruger kun en til fire bytes og kan kode op til 21 bit, hvilket præcis repræsenterer alle 17 Unicode-planer. utf8 er et tegnsæt i Mysql, der kun understøtter UTF-8-tegn op til tre bytes lange, hvilket er det grundlæggende multitekstplan i Unicode.
Hvorfor understøtter UTF8 i Mysql kun UTF-8-tegn med maksimalt tre bytes? Jeg tænkte over det, måske fordi da Mysql først blev udviklet, havde Unicode ikke et hjælpeplan. På det tidspunkt drømte Unicode-komitéen stadig om "65.535 tegn er nok til hele verden". Strenglængder i Mysql tæller tegn i stedet for bytes, og for CHAR-datatyper skal strengene være lange nok. Når man bruger utf8-tegnsættet, er den længde, der skal bevares, den utf8's længste tegnlængde ganget med strenglængden, så det er naturligt at begrænse den maksimale utf8-længde til 3, for eksempel vil CHAR(100) Mysql bevare 300 bytes. Hvad angår hvorfor efterfølgende versioner ikke understøtter 4-byte UTF-8-tegn, tror jeg, at det ene skyldes bagudkompatibilitet, og det andet er, at tegn uden for det grundlæggende flersprogede plan sjældent bruges.
For at gemme 4-byte UTF-8-tegn i Mysql kræves tegnsættet utf8mb4, men det understøttes kun efter version 5.5.3 (se version: vælg version(); )。 Jeg synes, at for bedre kompatibilitet bør du altid bruge utf8mb4 i stedet for utf8. For CHAR-type data bruger utf8mb4 mere plads, og ifølge den officielle Mysql-anbefaling skal man bruge VARCHAR i stedet for CHAR.
|