Tri mesta, kjer MySQL potrebuje kodiranje
- Stolpec ali tabela: nabor znakov, v katerem so podatki shranjeni, npr.
utf8mb4alilatin1. - Povezava: nabor znakov, v katerem se odjemalec in strežnik pogovarjata – nastavite ga z
SET NAMES utf8mb4ali v nastavitvah povezave. - Datoteka: kodiranje, s katerim se bere uvoz ali piše izvoz – v phpMyAdminu v polju Character set of the file (nabor znakov datoteke).
Če se ti trije ne ujemajo, se znaki pokvarijo. Najpogostejši primer: UTF-8 besedilo je bilo prek povezave latin1 zapisano v stolpec latin1. V aplikaciji je videti vse v redu, phpMyAdmin in izvoz pa kažeta ÄŤ, š in podobne napake.
Prej
"1","Črt Žagar","Cesta v Mestni log 1","Žalec"
Potem
"1","Črt Žagar","Cesta v Mestni log 1","Žalec"
Preverjanje naborov znakov
SHOW VARIABLES LIKE 'character_set%';pokaže nastavitve strežnika in povezave.SHOW CREATE TABLE stranke;pokaže nabor znakov tabele in njenih stolpcev.SELECT ime, HEX(ime) FROM stranke LIMIT 5;pokaže prave bajte: v stolpcuutf8mb4jeC48Dpravilenč, daljše zaporedje, kot jeC384C5A4, pa je že pokvarjenÄŤ.
Popravek izvoza ali dumpa
- Izvozite tabelo v phpMyAdminu kot SQL ali CSV – ali z ukazom
mysqldump --default-character-set=utf8mb4. - Povlecite datoteko v polje zgoraj. Mojibuster popravi samo pokvarjena mesta, pravilni znaki ostanejo nespremenjeni.
- Preglejte popravljena mesta pod Kaj se je spremenilo? in prenesite datoteko.
- Uvozite jo v tabelo z
utf8mb4in v pogovornem oknu za uvoz izberite nabor znakovutf-8. - Najprej preizkusite na kopiji, preden zamenjate pravo tabelo.
Izvoz nikoli ne zapusti vašega računalnika – kar je pomembno pri podatkih o strankah. Če imate datoteko v Windows-1250, vam bo pomagala stran pretvorba Windows-1250 v UTF-8.
Odpravite vzrok
- Nove tabele ustvarjajte z
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_slovenian_ci– to da tudi slovensko abecedno razvrščanje (č, š, ž). - Povezavo aplikacije nastavite na
utf8mb4, v PHP-ju npr. scharset=utf8mb4v PDO DSN-ju. - Če so bajti UTF-8 v stolpcu
latin1, ga ne pretvarjajte neposredno zCONVERT TO– to jih kodira drugič in nastane dvakrat kodirano besedilo. Varna pot vodi prek binarnega tipa: najprejMODIFY ime VARBINARY(255), natoMODIFY ime VARCHAR(255) CHARACTER SET utf8mb4. Pojav opisuje stran kaj je mojibake. - Če MySQL znake nadomesti z
?, jih stolpec ali povezava ne more prikazati. Kar je že tako shranjeno, je izgubljeno.
Pogosta vprašanja
Zakaj je v moji aplikaciji vse videti prav, v phpMyAdminu pa ne?
Ker aplikacija in baza dvakrat naredita isto napako: aplikacija piše UTF-8 prek povezave latin1 in ga enako prebere nazaj. phpMyAdmin se poveže pravilno, zato pokaže tisto, kar je res shranjeno.
Katero primerjavo (collation) naj uporabim?
Za slovenska besedila je najboljša utf8mb4_slovenian_ci, ker razvršča po slovenski abecedi. Za splošno rabo zadošča tudi utf8mb4_unicode_ci. Pomembnejši je nabor znakov utf8mb4 – ne utf8, ki v MySQL-u ne more shraniti emojijev.
Ali deluje tudi z MariaDB?
Da. MariaDB z nabori znakov ravna kot MySQL, ukazi pa so enaki.
Kako velik je lahko dump?
Do 100 MB na datoteko. Večje baze izvozite tabelo za tabelo.