WordPress in izvozi zbirke: ÄŤ in Ĺľ namesto č in ž

Po selitvi, posodobitvi ali izvozu zbirke podatkov objave nenadoma prikazujejo ÄŤ namesto č in Ĺľ namesto ž? Podatki so skoraj vedno še tam – berejo se le z napačnim kodiranjem. Mojibuster popravi izvoz, nato pa odpravite še vzrok v zbirki.

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

Kako izgleda težava

Vrstica iz SQL dumpa po selitvi na drug strežnik

Prej

INSERT INTO wp_posts (post_title) VALUES ('Šolski jedilnik – čokoladna torta');

Potem

INSERT INTO wp_posts (post_title) VALUES ('Šolski jedilnik – čokoladna torta');

Od kod prihaja

WordPress shranjuje besedilo kot UTF-8. Številne starejše namestitve pa imajo tabele ustvarjene kot latin1 ali latin2 ali se povezujejo s takim kodiranjem. Dokler pisanje in branje delata isto napako, nihče ničesar ne opazi. Po selitvi na nov strežnik, izvozu z phpMyAdminom ali spremembi kodiranja povezave pa vsak šumnik nenadoma postane dva znaka.

  • DB_CHARSET v datoteki wp-config.php je latin1 ali se ne ujema s tabelami.
  • Dump je bil izvožen kot latin1, uvožen pa kot utf8mb4 – ali obratno.
  • Vtičnik ali skripta za uvoz je že pokvarjeno besedilo pretvorila še enkrat. Tako nastane dvojno kodirano besedilo, na primer ÄŤ.

Popravilo izvoza

  1. Pred vsako spremembo naredite varnostno kopijo zbirke.
  2. Izvozite prizadete tabele kot datoteko .sql, na primer s phpMyAdminom ali z ukazom mysqldump --default-character-set=utf8mb4.
  3. Povlecite datoteko v okvir zgoraj. Mojibuster popravi le pokvarjena mesta in pokaže vsako spremembo.
  4. Prenesite popravljeno datoteko in jo uvozite z utf8mb4 v novo testno zbirko.
  5. Preverite stran. Če je vse videti prav, jo uvozite v živo zbirko.

Dump se nikoli ne naloži na strežnik – to je pomembno, ker običajno vsebuje uporabniške račune, e-poštne naslove in komentarje. Več o tem za podjetja in pooblaščence za varstvo podatkov.

Previdno pri serializiranih podatkih

WordPress nekatere nastavitve v wp_options in wp_postmeta shranjuje kot serializirane vrednosti PHP, na primer s:5:"Šola";. Število je dolžina v bajtih. Ko se Ä spet spremeni v č, dolžina ne ustreza več in WordPress vrednost zavrže. Zato najprej popravite vsebinske tabele, kot so wp_posts, wp_comments in wp_terms. Za nastavitve je boljše orodje wp search-replace iz WP-CLI, ker posodobi tudi dolžine.

Odprava vzroka v MySQL-u

  • Tabele in povezavo preklopite na utf8mb4, v wp-config.php pa nastavite define('DB_CHARSET', 'utf8mb4');.
  • Če stolpec latin1 vsebuje bajte UTF-8, ga ne pretvarjajte neposredno – s tem bi ga kodirali drugič. Običajna pot vodi prek binarnega tipa: najprej MODIFY … LONGBLOB, nato MODIFY … LONGTEXT CHARACTER SET utf8mb4.
  • Vsako spremembo najprej preizkusite na kopiji zbirke.

Pogosta vprašanja

Ali lahko popravim celotno zbirko WordPressa naenkrat?

Da, tudi velike SQL dumpe. Pazite pa na serializirane podatke v wp_options in wp_postmeta – s temi se bolje spopade WP-CLI.

Ali se bodo pravilni znaki v dumpu spremenili?

Ne. Mojibuster popravlja le zaporedja, ki so očitno pokvarjena. Pravilno besedilo ostane, kakršno je.

Kakšna je razlika med utf8 in utf8mb4?

V MySQL-u utf8 shrani le znake do treh bajtov, zato se emotikoni izgubijo. utf8mb4 je pravi UTF-8 in pravilna izbira za WordPress.

Ali deluje tudi za druge sisteme, ne le za WordPress?

Da. Joomla, Drupal, Magento ali vaša aplikacija na MySQL-u ali MariaDB imajo isto težavo in isto rešitev.

Več navodil