Kako izgleda težava
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_CHARSETv datotekiwp-config.phpjelatin1ali se ne ujema s tabelami.- Dump je bil izvožen kot
latin1, uvožen pa kotutf8mb4– ali obratno. - Vtičnik ali skripta za uvoz je že pokvarjeno besedilo pretvorila še enkrat. Tako nastane dvojno kodirano besedilo, na primer
ÄŤ.
Popravilo izvoza
- Pred vsako spremembo naredite varnostno kopijo zbirke.
- Izvozite prizadete tabele kot datoteko
.sql, na primer s phpMyAdminom ali z ukazommysqldump --default-character-set=utf8mb4. - Povlecite datoteko v okvir zgoraj. Mojibuster popravi le pokvarjena mesta in pokaže vsako spremembo.
- Prenesite popravljeno datoteko in jo uvozite z
utf8mb4v novo testno zbirko. - 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, vwp-config.phppa nastavitedefine('DB_CHARSET', 'utf8mb4');. - Če stolpec
latin1vsebuje bajte UTF-8, ga ne pretvarjajte neposredno – s tem bi ga kodirali drugič. Običajna pot vodi prek binarnega tipa: najprejMODIFY … LONGBLOB, natoMODIFY … 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.