Tri mjesta na kojima MySQL traži kodiranje
- Stupac ili tablica: skup znakova u kojem se podaci spremaju, npr.
utf8mb4ililatin1. - Veza: skup znakova u kojem klijent i poslužitelj komuniciraju – postavlja se s
SET NAMES utf8mb4ili u postavkama veze. - Datoteka: kodiranje kojim se čita uvoz ili piše izvoz – u phpMyAdminu u polju Character set of the file (skup znakova datoteke).
Ako se ta tri ne podudaraju, znakovi se pokvare. Najčešći slučaj: UTF-8 tekst je preko latin1 veze zapisan u latin1 stupac. U aplikaciji sve izgleda dobro, ali phpMyAdmin i izvoz prikazuju ÄŤ, š i slične pogreške.
Prije
"1","Željko Čačić","Ulica kneza Branimira 12","Osijek"
Poslije
"1","Željko Čačić","Ulica kneza Branimira 12","Osijek"
Provjera skupova znakova
SHOW VARIABLES LIKE 'character_set%';prikazuje postavke poslužitelja i veze.SHOW CREATE TABLE kupci;prikazuje skup znakova tablice i njezinih stupaca.SELECT ime, HEX(ime) FROM kupci LIMIT 5;prikazuje stvarne bajtove: u stupcuutf8mb4C48Dje ispravanč, a dulji niz poputC384C5A4već je pokvarenÄŤ.
Popravak izvoza ili dumpa
- Izvezite tablicu u phpMyAdminu kao SQL ili CSV – ili naredbom
mysqldump --default-character-set=utf8mb4. - Povucite datoteku u polje iznad. Mojibuster popravlja samo pokvarena mjesta, ispravni znakovi ostaju nepromijenjeni.
- Provjerite popravljena mjesta pod Što je promijenjeno? i preuzmite datoteku.
- Uvezite je u tablicu s
utf8mb4i u dijalogu za uvoz odaberite skup znakovautf-8. - Prvo isprobajte na kopiji prije nego zamijenite pravu tablicu.
Izvoz nikada ne napušta vaše računalo – što je važno kod podataka o kupcima. Ako imate datoteku u Windows-1250, pomoći će stranica pretvorba Windows-1250 u UTF-8.
Uklonite uzrok
- Nove tablice stvarajte s
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_croatian_ci– to daje i hrvatski redoslijed abecede (č, ć, dž, đ, š, ž). - Postavite vezu aplikacije na
utf8mb4, u PHP-u npr. scharset=utf8mb4u PDO DSN-u. - Ako su UTF-8 bajtovi u
latin1stupcu, ne pretvarajte ga izravno sCONVERT TO– to ih kodira drugi put i nastaje dvostruko kodiran tekst. Siguran put vodi preko binarnog tipa: prvoMODIFY ime VARBINARY(255), zatimMODIFY ime VARCHAR(255) CHARACTER SET utf8mb4. Pojavu opisuje stranica što je mojibake. - Ako MySQL znakove zamjenjuje s
?, stupac ili veza ih ne mogu prikazati. Ono što je već tako spremljeno izgubljeno je.
Česta pitanja
Zašto se u mojoj aplikaciji sve vidi dobro, a u phpMyAdminu ne?
Zato što aplikacija i baza dvaput čine istu pogrešku: aplikacija piše UTF-8 preko latin1 veze i na isti način ga čita natrag. phpMyAdmin se ispravno povezuje pa prikazuje ono što je zaista spremljeno.
Koji collation trebam koristiti?
Za hrvatske tekstove najbolji je utf8mb4_croatian_ci jer sortira prema hrvatskoj abecedi. Za opću upotrebu dovoljan je i utf8mb4_unicode_ci. Važniji je skup znakova utf8mb4 – ne utf8, koji u MySQL-u ne može spremiti emotikone.
Radi li to i s MariaDB-om?
Da. MariaDB s skupovima znakova postupa kao MySQL, a naredbe su iste.
Koliko dump smije biti velik?
Do 100 MB po datoteci. Veće baze izvezite tablicu po tablicu.