Miltä ongelma näyttää
Ennen
INSERT INTO wp_posts (post_title) VALUES ('Jäätelökioski – kesän uutuudet Jyväskylässä');Jälkeen
INSERT INTO wp_posts (post_title) VALUES ('Jäätelökioski – kesän uutuudet Jyväskylässä');Mistä se johtuu
WordPress tallentaa tekstin UTF-8:na. Monet vanhemmat asennukset loivat taulunsa kuitenkin latin1-merkistöllä tai yhdistivät latin1-yhteydellä. Niin kauan kuin kirjoittaminen ja lukeminen tekevät saman virheen, kukaan ei huomaa mitään. Kun siirrytään uudelle palvelimelle, viedään tietoja phpMyAdminilla tai vaihdetaan yhteyden merkistöä, jokainen ä ja ö muuttuu yhtäkkiä kahdeksi merkiksi.
DB_CHARSETtiedostossawp-config.phponlatin1tai ei vastaa tauluja.- Vedos vietiin
latin1-merkistöllä ja tuotiinutf8mb4-merkistöllä – tai päinvastoin. - Lisäosa tai tuontiskripti muunsi jo rikkinäisen tekstin vielä kerran. Silloin syntyy kaksinkertaisesti koodattua tekstiä kuten
ä.
Korjaa vienti
- Tee tietokannasta varmuuskopio ennen kuin muutat mitään.
- Vie vaikutuksen alaiset taulut
.sql-tiedostona, esimerkiksi phpMyAdminilla tai komennollamysqldump --default-character-set=utf8mb4. - Pudota tiedosto yllä olevaan kenttään. Mojibuster korjaa vain rikkinäiset kohdat ja näyttää jokaisen muutoksen.
- Lataa korjattu tiedosto ja tuo se
utf8mb4-merkistöllä uuteen testitietokantaan. - Tarkista sivusto. Jos kaikki näyttää oikealta, tuo tiedot tuotantotietokantaan.
Vedosta ei koskaan lähetetä minnekään – sillä on merkitystä, koska siinä on yleensä käyttäjätilejä, sähköpostiosoitteita ja kommentteja. Lisää aiheesta yrityksille ja tietosuojavastaaville.
Varo sarjallistettua dataa
WordPress tallentaa osan asetuksista tauluihin wp_options ja wp_postmeta sarjallistettuina PHP-arvoina, kuten s:10:"Jäätelö";. Luku on pituus tavuina. Kun ä muuttuu takaisin merkiksi ä, luku ei enää täsmää ja WordPress hylkää arvon. Korjaa siksi ensin sisältötaulut kuten wp_posts, wp_comments ja wp_terms. Asetuksiin sopii paremmin WP-CLI:n wp search-replace, koska se päivittää pituudet.
Poista syy MySQL:stä
- Vaihda taulut ja yhteys merkistöön
utf8mb4ja asetawp-config.php-tiedostoondefine('DB_CHARSET', 'utf8mb4');. - Jos
latin1-sarake sisältää UTF-8-tavuja, älä muunna sitä suoraan – silloin se koodattaisiin vielä kerran. Tavallinen reitti kulkee binäärityypin kautta: ensinMODIFY … LONGBLOB, sittenMODIFY … LONGTEXT CHARACTER SET utf8mb4. - Testaa jokainen muutos ensin tietokannan kopiolla.
Usein kysyttyä
Voinko korjata koko WordPress-tietokannan kerralla?
Kyllä, suuretkin SQL-vedokset. Huomioi kuitenkin sarjallistettu data tauluissa wp_options ja wp_postmeta – WP-CLI hoitaa ne paremmin.
Muuttuvatko vedoksen oikeat merkit?
Eivät. Mojibuster korjaa vain selvästi rikkinäiset jaksot. Oikea teksti pysyy sellaisenaan.
Mitä eroa on merkistöillä utf8 ja utf8mb4?
MySQL:ssä utf8 tallentaa enintään kolmen tavun merkkejä, joten emojit katoavat. utf8mb4 on aitoa UTF-8:aa ja oikea valinta WordPressille.
Toimiiko tämä muissakin järjestelmissä kuin WordPressissä?
Kyllä. Joomlalla, Drupalilla, Magentolla tai omalla MySQL- tai MariaDB-sovelluksellasi on sama ongelma ja sama korjaus.