Három hely, ahol a MySQL-nek kódolás kell
- Oszlop vagy tábla: a karakterkészlet, amelyben az adatok tárolódnak, például
utf8mb4vagylatin1. - Kapcsolat: a karakterkészlet, amelyben a kliens és a szerver beszélget –
SET NAMES utf8mb4paranccsal vagy a kapcsolat beállításaiban adható meg. - Fájl: a kódolás, amellyel az importot olvasod vagy az exportot írod – a phpMyAdminban a Fájl karakterkészlete mezőben (angol felületen: Character set of the file).
Ha a három nem egyezik, a karakterek elromlanak. A leggyakoribb eset: UTF-8 szöveg latin1 kapcsolaton át került egy latin1 oszlopba. Az alkalmazásban minden jónak látszik, a phpMyAdmin és az export viszont Ă©-szerű hibákat mutat.
Előtte
"1","Tóth Béla","Kossuth Lajos utca 12.","Győr"
Utána
"1","Tóth Béla","Kossuth Lajos utca 12.","Győr"
A karakterkészletek ellenőrzése
- A
SHOW VARIABLES LIKE 'character_set%';megmutatja a szerver és a kapcsolat beállításait. - A
SHOW CREATE TABLE ugyfelek;kiírja a tábla és oszlopai karakterkészletét. - A
SELECT nev, HEX(nev) FROM ugyfelek LIMIT 5;a valódi bájtokat mutatja:utf8mb4oszlopban aC3A9egyé, aC383C2A9viszont már elromlottĂ©.
Export vagy mentés javítása
- Exportáld a táblát a phpMyAdminban SQL-ként vagy CSV-ként – vagy a
mysqldump --default-character-set=utf8mb4paranccsal. - Húzd a fájlt a fenti mezőbe. A Mojibuster csak a hibás helyeket javítja, a helyes karakterek változatlanok maradnak.
- Nézd át a javított helyeket a Mi változott? résznél, majd töltsd le a fájlt.
- Importáld egy
utf8mb4táblába, és az import párbeszédablakban válaszd azutf-8karakterkészletet. - Előbb másolaton próbáld ki, mielőtt lecserélnéd az éles táblát.
Az export soha nem hagyja el a gépedet – ami ügyféladatoknál fontos. Ha Windows-1250 kódolású fájlod van, a Windows-1250 UTF-8-ra alakítása oldal segít.
Az ok megszüntetése
- Új táblákat
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_hungarian_cibeállítással hozz létre – ez a magyar ábécé szerinti rendezést is adja. - Állítsd az alkalmazás kapcsolatát
utf8mb4-re, PHP-ban például a PDO DSN-bencharset=utf8mb4megadásával. - Ha UTF-8 bájtok vannak egy
latin1oszlopban, ne használd közvetlenül aCONVERT TOparancsot – az másodszor is kódolja őket, és kétszeresen kódolt szöveg lesz belőle. A biztonságos út bináris típuson át vezet: előbbMODIFY nev VARBINARY(255), aztánMODIFY nev VARCHAR(255) CHARACTER SET utf8mb4. A jelenségről a mi az a mojibake oldalon olvashatsz. - Ha a MySQL
?jellel helyettesíti a karaktereket, az oszlop vagy a kapcsolat nem tudja ábrázolni őket. Ami már így tárolódott, elveszett.
Gyakori kérdések
Miért látszik minden jól az alkalmazásomban, a phpMyAdminban pedig nem?
Mert az alkalmazás és az adatbázis kétszer ugyanazt a hibát követi el: az alkalmazás UTF-8-at ír latin1 kapcsolaton át, és ugyanígy olvassa vissza. A phpMyAdmin helyesen csatlakozik, ezért azt mutatja, ami valóban tárolva van.
Melyik collationt használjam?
Magyar szövegekhez a utf8mb4_hungarian_ci a legjobb, mert a magyar ábécé szerint rendez (ö, ő, ü, ű külön betűk). Általános célra az utf8mb4_unicode_ci is megfelel. A karakterkészlet, az utf8mb4 fontosabb – nem az utf8, amely a MySQL-ben nem tud emojit tárolni.
MariaDB-vel is működik?
Igen. A MariaDB a karakterkészleteket a MySQL-lel azonosan kezeli, és a parancsok is ugyanazok.
Mekkora lehet a mentés?
Fájlonként legfeljebb 100 MB. Nagyobb adatbázist táblánként exportálj.