Kako izgleda problem
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_CHARSETu datoteciwp-config.phpjelatin1ili se ne podudara s tablicama.- Dump je izvezen kao
latin1, a uvezen kaoutf8mb4– ili obrnuto. - Dodatak ili skripta za uvoz još je jednom pretvorila već pokvaren tekst. Tako nastaje dvostruko kodiran tekst poput
ÄŤ.
Popravak izvoza
- Prije svake promjene napravite sigurnosnu kopiju baze.
- Izvezite zahvaćene tablice kao
.sqldatoteku, npr. phpMyAdminom ili naredbommysqldump --default-character-set=utf8mb4. - Povucite datoteku u okvir gore. Mojibuster popravlja samo pokvarena mjesta i pokazuje svaku promjenu.
- Preuzmite popravljenu datoteku i uvezite je s
utf8mb4u novu testnu bazu. - 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
utf8mb4i uwp-config.phppostavitedefine('DB_CHARSET', 'utf8mb4');. - Ako
latin1stupac sadrži UTF-8 bajtove, nemojte ga izravno pretvarati – time bi se kodirao drugi put. Uobičajeni put vodi preko binarnog tipa: prvoMODIFY … LONGBLOB, zatimMODIFY … 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.