1. Uvod
MySQL je to utf8mb4 kodiranje dodal po različici 5.5.3, kar pomeni, da je večina bajtov 4, in se posebej uporablja za združljivost s štiribajtnim unicode. Na srečo je utf8mb4 nadmnožica utf8 in ni potrebna nobena druga pretvorba, razen spremembe kodiranja v utf8mb4. Seveda je za prihranek prostora običajno dovolj uporabiti utf8.
2. Opis vsebine
Kot je bilo omenjeno zgoraj, ker lahko utf8 shrani večino kitajskih znakov, zakaj bi uporabljali utf8mb4? Največja dolžina znaka UTF8 kodiranja, ki ga podpira MySQL, je 3 bajte, in če naletite na širok znak s 4 bajti, boste vstavili izjemo. Največje število znakov Unicode, ki jih UTF-8 kodira s tremi bajti, je 0xffff, kar je osnovna večjezična ravnina (BMP) v Unicode. To pomeni, da nobenega Unicode znaka, ki ni v osnovni večbesedilni ravnini, ni mogoče shraniti z Mysql-ovim naborom znakov utf8. Sem spadajo emojiji (Emoji je posebna Unicode koda, ki jo pogosto najdemo na iOS in Android telefonih), številni redko uporabljeni kitajski znaki, pa tudi novi Unicode znaki in še več.
3. Osnovni vzrok problema
Izvirni format UTF-8 je uporabljal od enega do šestih bajtov in je lahko kodiral do 31 znakov. Najnovejša specifikacija UTF-8 uporablja le en do štiri bajte in lahko kodira do 21 bitov, kar predstavlja vseh 17 Unicode ravnin. utf8 je nabor znakov v Mysql, ki podpira le znake UTF-8 dolžine do treh bajtov, kar je osnovna večbesedilna ravnina v Unicode.
Zakaj UTF8 v MySQL podpira le znake UTF-8 z največ tremi bajti? Razmišljal sem o tem, morda zato, ker ko je bil MySQL prvič razvit, Unicode ni imel pomožne ravnine. Takrat je Unicode odbor še sanjal o "65.535 znakih je dovolj za ves svet". Dolžine nizov v MySQL štejejo znake namesto bajtov, za CHAR podatkovne tipe pa morajo biti nizi dovolj dolgi. Pri uporabi nabora znakov utf8 je dolžina, ki jo je treba ohraniti, najdaljša dolžina znakov utf8, pomnožena z dolžino niza, zato je naravno omejiti največjo dolžino utf8 na 3, na primer CHAR(100) Mysql bo ohranil 300 bajtov. Kar zadeva razlog, zakaj kasnejše različice ne podpirajo 4-bajtnih UTF-8 znakov, mislim, da je eden zaradi združljivosti za nazaj, drugi pa zato, ker se znaki zunaj osnovne večjezične ravnine redko uporabljajo.
Za shranjevanje 4-bajtnih UTF-8 znakov v Mysql je potreben nabor znakov utf8mb4, vendar je podprt šele po različici 5.5.3 (glej verzijo: select version(); )。 Mislim, da je za boljšo združljivost vedno priporočljivo uporabljati utf8mb4 namesto utf8. Za podatke tipa CHAR utf8mb4 zavzame več prostora, in po uradnem priporočilu Mysql uporabite VARCHAR namesto CHAR.
|