Sådan ser problemet ud
Før
INSERT INTO wp_posts (post_title) VALUES ('Smørrebrød på caféen – rødgrød med fløde');Efter
INSERT INTO wp_posts (post_title) VALUES ('Smørrebrød på caféen – rødgrød med fløde');Hvor det kommer fra
WordPress gemmer tekst som UTF-8. Mange ældre installationer oprettede dog deres tabeller som latin1 eller forbandt med latin1. Så længe skrivning og læsning begår den samme fejl, opdager ingen noget. Efter en flytning til en ny server, en eksport med phpMyAdmin eller et skift af forbindelsens tegnsæt bliver hvert æ, ø og å pludselig til to tegn.
DB_CHARSETiwp-config.phperlatin1eller passer ikke til tabellerne.- Dumpet blev eksporteret som
latin1og importeret somutf8mb4– eller omvendt. - Et plugin eller importscript konverterede allerede ødelagt tekst endnu en gang. Så opstår dobbeltkodet tekst som
ø.
Ret eksporten
- Tag en sikkerhedskopi af databasen, før du ændrer noget.
- Eksportér de berørte tabeller som
.sql-fil, for eksempel med phpMyAdmin ellermysqldump --default-character-set=utf8mb4. - Træk filen ind i feltet ovenfor. Mojibuster retter kun de ødelagte steder og viser dig hver ændring.
- Download den rettede fil, og importér den med
utf8mb4i en ny testdatabase. - Kontrollér websitet. Ser alt rigtigt ud, importerer du i den rigtige database.
Dumpet bliver aldrig uploadet – og det er vigtigt, fordi det som regel indeholder brugerkonti, e-mailadresser og kommentarer. Mere om det for virksomheder og databeskyttelsesrådgivere.
Pas på serialiserede data
WordPress gemmer nogle indstillinger i wp_options og wp_postmeta som serialiserede PHP-værdier som s:5:"Café";. Tallet er længden i bytes. Bliver é til é igen, passer det ikke længere, og WordPress kasserer værdien. Ret derfor først indholdstabeller som wp_posts, wp_comments og wp_terms. Til indstillinger er wp search-replace fra WP-CLI det bedre værktøj, fordi det opdaterer længderne.
Løs årsagen i MySQL
- Skift tabeller og forbindelse til
utf8mb4, og sætdefine('DB_CHARSET', 'utf8mb4');iwp-config.php. - Indeholder en
latin1-kolonne UTF-8-bytes, skal du ikke konvertere den direkte – så bliver den kodet en ekstra gang. Den almindelige vej går via en binær type: førstMODIFY … LONGBLOB, derefterMODIFY … LONGTEXT CHARACTER SET utf8mb4. - Test hver ændring på en kopi af databasen først.
Ofte stillede spørgsmål
Kan jeg rette en hel WordPress-database på én gang?
Ja, også store SQL-dumps. Vær dog opmærksom på serialiserede data i wp_options og wp_postmeta – WP-CLI håndterer det bedre.
Bliver korrekte tegn i dumpet ændret?
Nej. Mojibuster retter kun sekvenser, der tydeligt er ødelagt. Korrekt tekst forbliver, som den er.
Hvad er forskellen på utf8 og utf8mb4?
I MySQL gemmer utf8 kun tegn på op til tre bytes, så emojis går tabt. utf8mb4 er rigtig UTF-8 og det rigtige valg til WordPress.
Virker det også med andre systemer end WordPress?
Ja. Joomla, Drupal, Magento eller dit eget program på MySQL eller MariaDB har det samme problem og den samme løsning.