WordPress i izvozi baze: ÄŤ i Ĺľ umjesto č i ž

Nakon selidbe, ažuriranja ili izvoza baze članci odjednom prikazuju ÄŤ umjesto č i Ĺľ umjesto ž? Podaci su gotovo uvijek još tu – samo se čitaju s pogrešnim kodiranjem. Mojibuster popravlja izvoz, a zatim uzrok uklonite u bazi.

Radi s tekstom i datotekama:

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

Na primjer izvozi iz Excela, ispisi baza podataka, titlovi za filmove ili kod web-stranica.

Popravi

  1. Povucite datoteku ili zalijepite tekst
  2. Popravak se odvija automatski
  3. Kopirajte ili preuzmite
ili jednostavno povucite datoteku ovamo

Kako izgleda problem

Redak iz SQL dumpa nakon selidbe na drugi poslužitelj

Prije

INSERT INTO wp_posts (post_title) VALUES ('Šibenski jelovnik – čokoladna torta');

Poslije

INSERT INTO wp_posts (post_title) VALUES ('Šibenski jelovnik – čokoladna torta');

Odakle dolazi

WordPress sprema tekst kao UTF-8. Mnoge starije instalacije međutim imaju tablice kreirane kao latin1 ili latin2, ili se povezuju s takvim kodiranjem. Dok pisanje i čitanje čine istu pogrešku, nitko to ne primijeti. Nakon selidbe na novi poslužitelj, izvoza phpMyAdminom ili promjene kodiranja veze svaka kvačica odjednom postaje dva znaka.

  • DB_CHARSET u datoteci wp-config.php je latin1 ili se ne podudara s tablicama.
  • Dump je izvezen kao latin1, a uvezen kao utf8mb4 – ili obrnuto.
  • Dodatak ili skripta za uvoz još je jednom pretvorila već pokvaren tekst. Tako nastaje dvostruko kodiran tekst poput ÄŤ.

Popravak izvoza

  1. Prije svake promjene napravite sigurnosnu kopiju baze.
  2. Izvezite zahvaćene tablice kao .sql datoteku, npr. phpMyAdminom ili naredbom mysqldump --default-character-set=utf8mb4.
  3. Povucite datoteku u okvir gore. Mojibuster popravlja samo pokvarena mjesta i pokazuje svaku promjenu.
  4. Preuzmite popravljenu datoteku i uvezite je s utf8mb4 u novu testnu bazu.
  5. Provjerite stranicu. Ako sve izgleda ispravno, uvezite je u živu bazu.

Dump se nikada ne šalje na poslužitelj – a to je važno jer obično sadrži korisničke račune, adrese e-pošte i komentare. Više o tome za tvrtke i službenike za zaštitu podataka.

Pažnja kod serijaliziranih podataka

WordPress neke postavke sprema u wp_options i wp_postmeta kao serijalizirane PHP vrijednosti, npr. s:7:"Šećer";. Broj je duljina u bajtovima. Kad se Ä ponovno pretvori u č, duljina se više ne podudara i WordPress odbacuje vrijednost. Zato najprije popravite tablice sadržaja kao wp_posts, wp_comments i wp_terms. Za postavke je bolji alat wp search-replace iz WP-CLI-ja jer ažurira i duljine.

Uklanjanje uzroka u MySQL-u

  • Prebacite tablice i vezu na utf8mb4 i u wp-config.php postavite define('DB_CHARSET', 'utf8mb4');.
  • Ako latin1 stupac sadrži UTF-8 bajtove, nemojte ga izravno pretvarati – time bi se kodirao drugi put. Uobičajeni put vodi preko binarnog tipa: prvo MODIFY … LONGBLOB, zatim MODIFY … LONGTEXT CHARACTER SET utf8mb4.
  • Svaku promjenu najprije isprobajte na kopiji baze.

Česta pitanja

Mogu li popraviti cijelu WordPress bazu odjednom?

Da, čak i velike SQL dumpove. Pripazite na serijalizirane podatke u wp_options i wp_postmeta – s njima bolje izlazi na kraj WP-CLI.

Hoće li se ispravni znakovi u dumpu promijeniti?

Ne. Mojibuster popravlja samo nizove koji su očito pokvareni. Ispravan tekst ostaje kakav jest.

Koja je razlika između utf8 i utf8mb4?

U MySQL-u utf8 sprema samo znakove do tri bajta pa se emotikoni gube. utf8mb4 je pravi UTF-8 i ispravan izbor za WordPress.

Radi li to i za druge sustave, ne samo WordPress?

Da. Joomla, Drupal, Magento ili vaša aplikacija na MySQL-u ili MariaDB-u imaju isti problem i isto rješenje.

Više uputa