Popravek šumnikov v MySQL-u in phpMyAdminu

phpMyAdmin, vaš SQL dump ali aplikacija kažejo ÄŤ ali Ĺľ namesto č in ž? Običajno se kodiranje tabele, povezave in uvoza ne ujema. Mojibuster popravlja izvoze kar v brskalniku – nato pa MySQL trajno pravilno nastavite.

Deluje z besedilom in datotekami:

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

Na primer izvozi iz Excela, izpisi baz podatkov, podnapisi za filme ali koda spletnih strani.

Popravi

  1. Povlecite datoteko ali prilepite besedilo
  2. Popravilo poteka samodejno
  3. Kopirajte ali prenesite
ali datoteko preprosto povlecite sem

Tri mesta, kjer MySQL potrebuje kodiranje

  • Stolpec ali tabela: nabor znakov, v katerem so podatki shranjeni, npr. utf8mb4 ali latin1.
  • Povezava: nabor znakov, v katerem se odjemalec in strežnik pogovarjata – nastavite ga z SET NAMES utf8mb4 ali 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.

Vrstica iz CSV-izvoza phpMyAdmina

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 stolpcu utf8mb4 je C48D pravilen č, daljše zaporedje, kot je C384C5A4, pa je že pokvarjen ÄŤ.

Popravek izvoza ali dumpa

  1. Izvozite tabelo v phpMyAdminu kot SQL ali CSV – ali z ukazom mysqldump --default-character-set=utf8mb4.
  2. Povlecite datoteko v polje zgoraj. Mojibuster popravi samo pokvarjena mesta, pravilni znaki ostanejo nespremenjeni.
  3. Preglejte popravljena mesta pod Kaj se je spremenilo? in prenesite datoteko.
  4. Uvozite jo v tabelo z utf8mb4 in v pogovornem oknu za uvoz izberite nabor znakov utf-8.
  5. 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. s charset=utf8mb4 v PDO DSN-ju.
  • Če so bajti UTF-8 v stolpcu latin1, ga ne pretvarjajte neposredno z CONVERT TO – to jih kodira drugič in nastane dvakrat kodirano besedilo. Varna pot vodi prek binarnega tipa: najprej MODIFY ime VARBINARY(255), nato MODIFY 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.

Več navodil