Oprava slovenskej diakritiky v MySQL a phpMyAdmin

phpMyAdmin, SQL dump alebo vaša aplikácia ukazujú ľ namiesto ľ či ? namiesto č? Zvyčajne si tabuľka, spojenie a import nezodpovedajú. Mojibuster opraví export priamo v prehliadači – a potom nastavíte MySQL správne natrvalo.

Funguje s textom aj súbormi:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Napríklad exporty z Excelu, výpisy databáz, titulky alebo kód webových stránok.

Opraviť

  1. Pretiahnite súbor alebo vložte text
  2. Oprava prebehne automaticky
  3. Skopírujte alebo stiahnite
alebo súbor jednoducho pretiahnite sem

Tri miesta, kde MySQL potrebuje kódovanie

  • Stĺpec alebo tabuľka: znaková sada, v ktorej sú dáta uložené, napríklad utf8mb4, latin2 alebo cp1250.
  • Spojenie: znaková sada, v ktorej spolu klient a server komunikujú – nastavuje sa príkazom SET NAMES utf8mb4 alebo 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 ÄŤ.

Riadok z exportu CSV z phpMyAdmin

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ĺpci utf8mb4 je C3A1 písmeno á, zatiaľ čo C383C2A1 je už pokazené á.

Oprava exportu alebo dumpu

  1. Exportujte tabuľku v phpMyAdmin ako SQL alebo CSV – alebo príkazom mysqldump --default-character-set=utf8mb4.
  2. Presuňte súbor do poľa vyššie. Mojibuster opraví iba pokazené miesta, správne znaky ostanú bez zmeny.
  3. Skontrolujte opravené miesta v časti Čo sa zmenilo? a stiahnite súbor.
  4. Naimportujte ho do tabuľky s utf8mb4 a v dialógu importu zvoľte znakovú sadu utf-8.
  5. 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ť aj utf8mb4_slovak_ci.
  • Nastavte v aplikácii spojenie utf8mb4, v PHP napríklad cez charset=utf8mb4 v DSN pre PDO.
  • Ak sú bajty UTF-8 uložené v stĺpci latin1, neprevádzajte ho priamo cez CONVERT 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: najprv MODIFY priezvisko VARBINARY(255), potom MODIFY 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.

Ďalšie návody