1. Introduktion
MySQL lade till denna utf8mb4-kodning efter 5.5.3, vilket betyder de flesta byte 4, och används specifikt för att vara kompatibel med fyrbytes unicode. Som tur är är utf8mb4 en övermängd av utf8, och ingen annan konvertering krävs förutom att ändra kodningen till utf8mb4. Självklart, för att spara utrymme, räcker det oftast att använda utf8.
2. Innehållsbeskrivning
Som nämnts ovan, eftersom utf8 kan spara de flesta kinesiska tecken, varför använda utf8mb4? Den maximala teckenlängden för UTF8-kodning som stöds av MySQL är 3 byte, och om du stöter på ett brett tecken på 4 byte kommer du att lägga till ett undantag. Det maximala Unicode-tecknet som UTF-8 kodar på tre byte är 0xffff, vilket är det grundläggande flerspråkiga planet (BMP) i Unicode. Det vill säga, alla Unicode-tecken som inte finns i det grundläggande multitextplanet kan inte lagras med Mysqls utf8-teckenuppsättning. Dessa inkluderar emojis (Emoji är en speciell Unicode-kodning som ofta finns på iOS- och Android-telefoner), samt många sällan använda kinesiska tecken, samt nya Unicode-tecken och mer.
3. Problemets grundorsak
Det ursprungliga UTF-8-formatet använde en till sex byte och kunde koda upp till 31 tecken. Den senaste UTF-8-specifikationen använder endast en till fyra byte och kan koda upp till 21 bitar, vilket är exakt vad som representerar alla 17 Unicode-plan. utf8 är en teckenuppsättning i Mysql som endast stöder UTF-8-tecken upp till tre byte långa, vilket är det grundläggande multitextplanet i Unicode.
Varför stöder UTF8 i Mysql bara UTF-8-tecken med maximalt tre byte? Jag funderade på det, kanske för att när Mysql först utvecklades hade Unicode inget hjälpplan. Vid den tiden drömde Unicode-kommittén fortfarande om att "65 535 tecken är tillräckligt för hela världen". Stränglängder i Mysql räknar tecken istället för byte, och för CHAR-datatyper måste strängarna vara tillräckligt långa. När utf8-teckenuppsättningen används är längden som måste bevaras den längsta utf8-teckenlängden multiplicerat med stränglängden, så det är naturligt att begränsa den maximala utf8-längden till 3, till exempel behåller CHAR(100) Mysql 300 byte. När det gäller varför senare versioner inte stöder 4-bytes UTF-8-tecken tror jag att det ena beror på bakåtkompatibilitet, och det andra är att tecken utanför det grundläggande flerspråkiga planet sällan används.
För att spara 4-bytes UTF-8-tecken i Mysql krävs teckenuppsättningen utf8mb4, men den stöds endast efter version 5.5.3 (se version: välj version(); )。 Jag tycker att för bättre kompatibilitet bör du alltid använda utf8mb4 istället för utf8. För CHAR-typ data tar utf8mb4 mer utrymme, och enligt den officiella Mysql-rekommendationen, använd VARCHAR istället för CHAR.
|