Hogyan néz ki a hiba?
Előtte
INSERT INTO wp_posts (post_title) VALUES ('Tavaszi menĂĽ – töltött káposzta');Utána
INSERT INTO wp_posts (post_title) VALUES ('Tavaszi menü – töltött káposzta');Honnan ered?
A WordPress a szöveget UTF-8-ban tárolja. Sok régebbi telepítésben azonban a táblák latin1 vagy latin2 kódolással jöttek létre, esetleg a kapcsolat használt ilyet. Amíg az írás és az olvasás ugyanazt a hibát követi el, senki sem veszi észre. Új szerverre költözés, phpMyAdminnal készített export vagy a kapcsolat karakterkészletének módosítása után viszont minden ékezetes betű hirtelen két karakterré esik szét.
- A
wp-config.php-ban aDB_CHARSETértékelatin1, vagy nem egyezik a táblákéval. - A dumpot
latin1kódolással exportálták, ésutf8mb4-ként importálták – vagy fordítva. - Egy bővítmény vagy importszkript az már sérült szöveget még egyszer átalakította. Így jön létre a dupla kódolású szöveg, például
Ă©.
Az export javítása
- Mielőtt bármit módosít, készítsen biztonsági mentést az adatbázisról.
- Exportálja az érintett táblákat
.sqlfájlba, például phpMyAdminnal vagymysqldump --default-character-set=utf8mb4paranccsal. - Húzza a fájlt a fenti mezőbe. A Mojibuster csak a sérült helyeket javítja, és minden változást megmutat.
- Töltse le a javított fájlt, és
utf8mb4kódolással importálja egy új tesztadatbázisba. - Ellenőrizze az oldalt. Ha minden rendben van, importálja az éles adatbázisba.
A dump nem kerül feltöltésre – ez azért fontos, mert általában felhasználói fiókokat, e-mail-címeket és hozzászólásokat tartalmaz. Erről bővebben a vállalkozásoknak és adatvédelmi tisztviselőknek szóló oldalon olvashat.
Vigyázat a szerializált adatokkal
A WordPress egyes beállításokat a wp_options és wp_postmeta táblákban szerializált PHP-értékként tárol, például s:6:"Kávé"; alakban. A szám a hossz bájtokban. Ha a Ă© újra é lesz, a hossz már nem egyezik, és a WordPress eldobja az értéket. Ezért először a tartalmi táblákat javítsa: wp_posts, wp_comments, wp_terms. A beállításokhoz a WP-CLI wp search-replace parancsa a jobb eszköz, mert frissíti a hosszakat is.
Az ok megszüntetése a MySQL-ben
- Állítsa át a táblákat és a kapcsolatot
utf8mb4-re, awp-config.php-ban pedig adja meg:define('DB_CHARSET', 'utf8mb4');. - Ha egy
latin1oszlopban UTF-8 bájtok vannak, ne alakítsa át közvetlenül – az még egyszer kódolná. A szokásos út bináris típuson át vezet: előszörMODIFY … LONGBLOB, utánaMODIFY … LONGTEXT CHARACTER SET utf8mb4. - Minden módosítást először az adatbázis egy másolatán próbáljon ki.
Gyakori kérdések
Egyszerre javítható egy egész WordPress-adatbázis?
Igen, még nagy SQL-dumpok is. A wp_options és wp_postmeta szerializált adataira azonban figyeljen – ezt a WP-CLI jobban kezeli.
Megváltoznak a dump helyes karakterei?
Nem. A Mojibuster csak az egyértelműen sérült sorozatokat javítja. A helyes szöveg változatlan marad.
Mi a különbség az utf8 és az utf8mb4 között?
A MySQL-ben az utf8 legfeljebb hárombájtos karaktereket tárol, így az emojik elvesznek. Az utf8mb4 valódi UTF-8, és a WordPresshez ez a helyes választás.
Más rendszereknél is működik, nem csak WordPressnél?
Igen. A Joomla, Drupal, Magento vagy a saját, MySQL-re vagy MariaDB-re épülő alkalmazás ugyanezzel a problémával küzd, és ugyanaz a megoldás.