1. Įvadas
MySQL pridėjo šį utf8mb4 kodavimą po 5.5.3, o tai reiškia, kad dauguma baitų 4, ir yra specialiai naudojamas, kad būtų suderinamas su keturių baitų unikodu. Laimei, utf8mb4 yra utf8 superaibė ir nereikia jokio kito konvertavimo, išskyrus kodavimo pakeitimą į utf8mb4. Žinoma, norint sutaupyti vietos, paprastai pakanka naudoti utf8.
2. Turinio aprašymas
Kaip minėta aukščiau, kadangi utf8 gali išsaugoti daugumą kinų rašmenų, kodėl verta naudoti utf8mb4? Didžiausias MySQL palaikomo UTF8 kodavimo simbolių ilgis yra 3 baitai, o jei susidursite su plačiu 4 baitų simboliu, įterpsite išimtį. Maksimalus trijų baitų UTF-8 užkoduotas Unicode simbolis yra 0xffff, kuris yra pagrindinė daugiakalbė plokštuma (BMP) Unicode. Tai reiškia, kad bet koks Unicode simbolis, kuris nėra pagrindinėje multiteksto plokštumoje, negali būti saugomas naudojant MySQL utf8 simbolių rinkinį. Tai apima jaustukus ("Emoji" yra specialus "Unicode" kodavimas, dažniausiai randamas "iOS" ir "Android" telefonuose) ir daug neretai naudojamų kinų simbolių, taip pat bet kokius naujus "Unicode" simbolius ir kt.
3. Pagrindinė problemos priežastis
Originalus UTF-8 formatas naudojo nuo vieno iki šešių baitų ir galėjo koduoti iki 31 simbolio. Naujausia UTF-8 specifikacija naudoja tik nuo vieno iki keturių baitų ir gali koduoti iki 21 bito, o tai yra būtent tai, kas atspindi visas 17 Unicode plokštumų. utf8 yra MySQL simbolių rinkinys, palaikantis tik iki trijų baitų ilgio UTF-8 simbolius, kurie yra pagrindinė kelių tekstų plokštuma Unicode.
Kodėl UTF8 MySQL palaiko tik UTF-8 simbolius, kurių daugiausiai yra trys baitai? Aš galvojau apie tai, gal todėl, kad kai MySQL buvo pirmą kartą sukurtas, Unicode neturėjo pagalbinės plokštumos. Tuo metu Unicode komitetas vis dar svajojo apie "65 535 simbolių užtenka visam pasauliui". MySQL eilučių ilgiai skaičiuoja simbolius, o ne baitus, o CHAR duomenų tipams eilutės turi būti pakankamai ilgos. Naudojant utf8 simbolių rinkinį, ilgis, kurį reikia išsaugoti, yra ilgiausias utf8 simbolių ilgis, padaugintas iš eilutės ilgio, todėl natūralu apriboti maksimalų utf8 ilgį iki 3, pavyzdžiui, CHAR(100) Mysql išlaikys 300 baitų. Kalbant apie tai, kodėl vėlesnės versijos nepalaiko 4 baitų UTF-8 simbolių, manau, kad viena yra dėl atgalinio suderinamumo priežasčių, o kita yra ta, kad simboliai už pagrindinės daugiakalbės plokštumos ribų yra retai naudojami.
Norint išsaugoti 4 baitų UTF-8 simbolius Mysql, reikalingas utf8mb4 simbolių rinkinys, tačiau jis palaikomas tik po 5.5.3 versijos (žr. versiją: pasirinkite versiją (); )。 Manau, kad dėl geresnio suderinamumo visada turėtumėte naudoti utf8mb4, o ne utf8. CHAR tipo duomenims utf8mb4 užima daugiau vietos, o pagal oficialią MySQL rekomendaciją vietoj CHAR naudokite MARCHAR.
|