Så ser problemet ut
Före
INSERT INTO wp_posts (post_title) VALUES ('Smörgåsar på kaféet – räksmörgås');Efter
INSERT INTO wp_posts (post_title) VALUES ('Smörgåsar på kaféet – räksmörgås');Varifrån det kommer
WordPress lagrar text som UTF-8. Många äldre installationer skapade dock sina tabeller som latin1 eller anslöt med latin1. Så länge skrivning och läsning gör samma fel märker ingen något. Efter en flytt till ny server, en export med phpMyAdmin eller ett byte av anslutningens teckenuppsättning blir varje å, ä och ö plötsligt två tecken.
DB_CHARSETiwp-config.phpärlatin1eller stämmer inte med tabellerna.- Dumpen exporterades som
latin1och importerades somutf8mb4– eller tvärtom. - Ett tillägg eller importskript konverterade redan trasig text en gång till. Då uppstår dubbelkodad text som
ä.
Laga exporten
- Ta en säkerhetskopia av databasen innan du ändrar något.
- Exportera de drabbade tabellerna som
.sql-fil, till exempel med phpMyAdmin ellermysqldump --default-character-set=utf8mb4. - Släpp filen i rutan ovan. Mojibuster lagar bara de trasiga ställena och visar varje ändring.
- Ladda ner den lagade filen och importera den med
utf8mb4i en ny testdatabas. - Kontrollera webbplatsen. Ser allt rätt ut importerar du till den skarpa databasen.
Dumpen laddas aldrig upp – vilket är viktigt, eftersom den oftast innehåller användarkonton, e-postadresser och kommentarer. Mer om det för företag och dataskyddsombud.
Se upp med serialiserad data
WordPress lagrar vissa inställningar i wp_options och wp_postmeta som serialiserade PHP-värden, till exempel s:5:"Café";. Talet är längden i byte. Blir é till é igen stämmer det inte längre, och WordPress kastar värdet. Laga därför innehållstabeller som wp_posts, wp_comments och wp_terms först. För inställningar är wp search-replace från WP-CLI det bättre verktyget, eftersom det uppdaterar längderna.
Åtgärda orsaken i MySQL
- Byt tabeller och anslutning till
utf8mb4och sättdefine('DB_CHARSET', 'utf8mb4');iwp-config.php. - Innehåller en
latin1-kolumn UTF-8-byte ska du inte konvertera den direkt – då kodas den en andra gång. Den vanliga vägen går via en binär typ: förstMODIFY … LONGBLOB, sedanMODIFY … LONGTEXT CHARACTER SET utf8mb4. - Testa varje ändring på en kopia av databasen först.
Vanliga frågor
Kan jag laga en hel WordPress-databas på en gång?
Ja, även stora SQL-dumpar. Tänk dock på serialiserad data i wp_options och wp_postmeta – WP-CLI hanterar det bättre.
Ändras korrekta tecken i dumpen?
Nej. Mojibuster lagar bara sekvenser som tydligt är trasiga. Korrekt text förblir som den är.
Vad är skillnaden mellan utf8 och utf8mb4?
I MySQL lagrar utf8 bara tecken på upp till tre byte, så emojis går förlorade. utf8mb4 är riktig UTF-8 och rätt val för WordPress.
Fungerar det för andra system än WordPress?
Ja. Joomla, Drupal, Magento eller ditt eget program på MySQL eller MariaDB har samma problem och samma lösning.