1. Úvod
MySQL pridal toto kódovanie utf8mb4 po verzii 5.5.3, čo znamená väčšinu bajtov 4, a špeciálne sa používa na kompatibilitu so štvorbajtovým unicode. Našťastie, utf8mb4 je nadmnožina utf8 a nie je potrebná žiadna iná konverzia okrem zmeny kódovania na utf8mb4. Samozrejme, na úsporu miesta stačí použiť utf8.
2. Popis obsahu
Ako už bolo spomenuté, keďže utf8 dokáže uložiť väčšinu čínskych znakov, prečo používať utf8mb4? Maximálna dĺžka znaku kódovania UTF8 podporovaného MySQL je 3 bajty, a ak narazíte na široký znak 4 bajty, vložíte výnimku. Maximálny počet troch bajtov zakódovaný v Unicode znaku v UTF-8 je 0xffff, čo je základná viacjazyčná rovina (BMP) v Unicode. To znamená, že akýkoľvek Unicode znak, ktorý nie je v základnej multitextovej rovine, nemôže byť uložený pomocou znakovej sady utf8 Mysql. Patria sem emoji (Emoji je špeciálne Unicode kódovanie, bežne používané na iOS a Android telefónoch), a mnoho nezvyčajne používaných čínskych znakov, ako aj nové Unicode znaky a ďalšie.
3. Koreňová príčina problému
Pôvodný formát UTF-8 používal od jedného do šiestich bajtov a dokázal kódovať až 31 znakov. Najnovšia špecifikácia UTF-8 používa len jeden až štyri bajty a dokáže kódovať až 21 bitov, čo presne reprezentuje všetkých 17 Unicode rovín. utf8 je znaková sada v Mysql, ktorá podporuje iba znaky UTF-8 do dĺžky troch bajtov, čo je základná viactextová rovina v Unicode.
Prečo UTF8 v MySQL podporuje iba znaky UTF-8 s maximálne tromi bajtmi? Premýšľal som o tom, možno preto, že keď bol MySQL prvýkrát vyvíjaný, Unicode nemal pomocnú rovinu. V tom čase výbor Unicode ešte sníval o "65 535 znakov stačí pre celý svet". Dĺžky reťazcov v Mysql počítajú znaky, nie bajty, a pre CHAR dátové typy musia byť reťazce dostatočne dlhé. Pri použití znakovej sady utf8 je dĺžka, ktorú treba zachovať, najdlhšia dĺžka znaku utf8 vynásobená dĺžkou reťazca, takže je prirodzené obmedziť maximálnu dĺžku utf8 na 3, napríklad CHAR(100) Mysql si zachová 300 bajtov. Čo sa týka toho, prečo neskoršie verzie nepodporujú 4-bajtové UTF-8 znaky, myslím, že jedným z dôvodov je spätná kompatibilita a druhým je, že znaky mimo základnej viacjazyčnej roviny sa zriedka používajú.
Na uloženie 4-bajtových UTF-8 znakov v MySQL je potrebná znaková sada utf8mb4, ale je podporovaná až po verzii 5.5.3 (pozri verziu: select version(); )。 Myslím, že pre lepšiu kompatibilitu by ste mali vždy používať utf8mb4 namiesto utf8. Pre údaje typu CHAR zaberá utf8mb4 viac miesta a podľa oficiálneho odporúčania Mysql použite VARCHAR namiesto CHAR.
|