Tri miesta, kde MySQL potrebuje kódovanie
- Stĺpec alebo tabuľka: znaková sada, v ktorej sú dáta uložené, napríklad
utf8mb4,latin2alebocp1250. - Spojenie: znaková sada, v ktorej spolu klient a server komunikujú – nastavuje sa príkazom
SET NAMES utf8mb4alebo v nastaveniach spojenia. - Súbor: kódovanie, v ktorom sa číta import alebo zapisuje export – v phpMyAdmin v poli Znaková sada súboru.
Ak sa tieto tri nastavenia nezhodujú, diakritika sa pokazí. Najčastejší prípad: text v UTF-8 sa cez spojenie latin1 zapísal do stĺpca latin1. Aplikácia vyzerá v poriadku, ale phpMyAdmin a export ukazujú ľ a ÄŤ.
Pred
"1","Ján Kováč","Hlavná 12","Žilina"
Po
"1","Ján Kováč","Hlavná 12","Žilina"
Skontrolujte znakové sady
SHOW VARIABLES LIKE 'character_set%';ukáže nastavenia servera a spojenia.SHOW CREATE TABLE zakaznici;ukáže znakovú sadu tabuľky a jej stĺpcov.SELECT priezvisko, HEX(priezvisko) FROM zakaznici LIMIT 5;ukáže skutočné bajty: v stĺpciutf8mb4jeC3A1písmenoá, zatiaľ čoC383C2A1je už pokazenéá.
Oprava exportu alebo dumpu
- Exportujte tabuľku v phpMyAdmin ako SQL alebo CSV – alebo príkazom
mysqldump --default-character-set=utf8mb4. - Presuňte súbor do poľa vyššie. Mojibuster opraví iba pokazené miesta, správne znaky ostanú bez zmeny.
- Skontrolujte opravené miesta v časti Čo sa zmenilo? a stiahnite súbor.
- Naimportujte ho do tabuľky s
utf8mb4a v dialógu importu zvoľte znakovú saduutf-8. - Najprv to vyskúšajte na kópii, než nahradíte skutočnú tabuľku.
Export nikdy neopustí váš počítač – čo pri zákazníckych dátach záleží. Ak sú texty v databáze pokazené vo viacerých vrstvách naraz, prečítajte si stránku čo je mojibake.
Odstráňte príčinu
- Nové tabuľky vytvárajte s
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci. Pre slovenské triedenie sa dá použiť ajutf8mb4_slovak_ci. - Nastavte v aplikácii spojenie
utf8mb4, v PHP napríklad cezcharset=utf8mb4v DSN pre PDO. - Ak sú bajty UTF-8 uložené v stĺpci
latin1, neprevádzajte ho priamo cezCONVERT TO– zakódovali by ste ich druhýkrát a vznikol by dvakrát zakódovaný text. Bezpečná cesta vedie cez binárny typ: najprvMODIFY priezvisko VARBINARY(255), potomMODIFY priezvisko VARCHAR(255) CHARACTER SET utf8mb4. - Ak MySQL nahrádza písmená znakom
?, stĺpec alebo spojenie ich nevie uložiť. Čo je takto uložené, je stratené – viac na stránke čo je mojibake.
Časté otázky
Prečo v aplikácii všetko vyzerá správne, ale v phpMyAdmin nie?
Pretože aplikácia a databáza robia rovnakú chybu dvakrát: aplikácia zapisuje UTF-8 cez spojenie latin1 a rovnako to aj číta. phpMyAdmin sa pripája správne, a preto ukazuje, čo je naozaj uložené.
Akú collation zvoliť?
utf8mb4_unicode_ci sa hodí pre väčšinu aplikácií, od MySQL 8 je predvolená utf8mb4_0900_ai_ci. Dôležitejšia je znaková sada utf8mb4 – nie utf8, ktorá v MySQL neuloží emoji.
Funguje to aj s MariaDB?
Áno. MariaDB narába so znakovými sadami rovnako ako MySQL a príkazy sú rovnaké.
Aký veľký môže byť dump?
Až 100 MB na súbor. Väčšie databázy exportujte tabuľku po tabuľke.