2024. április 24., szerda

Gyorskeresés

MySQL: utf8 vs. utf8mb4

Írta: |

[ ÚJ BEJEGYZÉS ]

Jelenleg az UTF-8 a legnépszerűbb a karakterkódolások közül. Ez nem is véletlen, hiszen támogatja az összes Unicode karaktert, amik változó bájthosszúságúak (1-4; a karakterek az reprezentáláshoz szükséges legkevesebb tárhelyen tárolhatók). Véleményem szerint az UTF-8-on és ASCII-n kívül az összes karakterkódolást be kellene hinteni sóval, és maximum read only módban megnyithatónak hagyni ;]
Fejlesztésre XAMPP-ot használtam Windows-on, amiben annyi furcsaság van, hogy már egy ideje a MySQL helyett a forkja, MariaDB az adatbáziskezelő. Emoji-t szerettem volna kiolvasni és megjeleníteni PHP-val, amihez tudatosan az utf8 kódolású collationt használtam (PHP-ban csatlakozásnál is megadtam)... Egyszerűbb karakterekkel (pl. ékezetes) működött, viszont az emoji már nem ment. Ekkor rágugliztam és kiderült, hogy a MySQL féle utf8 nem is rendes 4 bájtos UTF-8 kódolás, hanem annak 3 bájton tárolt variánsa, amivel lehetetlen ilyen az emojik magasabb karakterkódjait tárolni. A megoldás, vagyis a "rendes" UTF-8 kódolás az utf8mb4, amit teljesen ajánlott és érdemes is használni. PHP-ban mysqli-ben / pdo-ban is érdemes átállítani. (Azt szomorú látni, hogy a PHP dokumentációjában erről nem szólnak, csak kommentben, és SO-n / blogposztokban kell utánaolvasni.) Szerencsére a MySQL 8-as verziótól alapértelmezetten az mb4-et használja, viszont a xampp-ban még mindig latin1 az alapértelmezett beállítás a MariaDB-hez (pedig a my.ini fájlban át lehetne írni). (Tudom a Windows rossz, lusta vagyok amiért xampp-ot használok, nem biztonságos. Linuxon inkább rendes LAMP/LEMP stacket használnék, rá a xampp gui-s telepítője vicc, amit egyszer kipróbáltam ki.)
Akit esetleg több dolog érdekel vagy szeretné átkonvertálni az adatbázisát mb4-re, akkor ezt a cikket ajánlom (amit én is olvastam), technikai részletekkel és parancsokkal.

Hozzászólások

(#1) Dluinet


Dluinet
nagyúr

Miért nem UTF-32?

"Mindig is első szerettem volna lenni!" - II. János Pál pápa

(#2) UnA válasza Dluinet (#1) üzenetére


UnA
Korrektor

Jaj. :)

Egyébként pedig nem 4 byte-on tárol az UTF-8.

(#3) Dluinet válasza UnA (#2) üzenetére


Dluinet
nagyúr

4 byte-ot nem vittata senki

"Mindig is első szerettem volna lenni!" - II. János Pál pápa

(#4) weiss


weiss
addikt

Azt szomorú látni, hogy a PHP dokumentációjában erről nem szólnak

Merthogy miért szólnának egy szkriptnyelv doksijában arról, hogy a DB mit nem tud?

I did nothing, the pavement was his enemy!

(#5) SunyaMacs


SunyaMacs
aktív tag

#1:
Az UTF-8-ban például az egyszerű latin karakterek tárolásához csak 1 bájt kell, míg az UTF-32-ben ezek lefoglalják a teljes 4 bájtot.

#4:
Azért szerintem a mysqli (ami egy DB driver expliciten MySQL-hez) set_charset methodjánál elférne megjegyzésben, ha a legtöbb ember a charset-et úgyis erre állítaná át, vagyis a 4 bájtos variánsra, és hogy ne kelljen máshonnan rájönni.

(#6) UnA válasza Dluinet (#3) üzenetére


UnA
Korrektor

Azt nem is neked írtam, csak arra, ami az eredeti szövegben volt: "a MySQL féle utf8 nem is rendes 4 bájtos UTF-8 kódolás, hanem annak 3 bájton tárolt variánsa".

(#7) szakatsa


szakatsa
csendes tag

A xampp -ot nem leszólva, próbáld ki a dockert. minimál lurning curve után messze megelőzi minden tekintetben a xampp / lamp / wamp stb. programokat

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.