WordPress en database-exports: é en ’ in plaats van é en ’

Tonen je berichten na een migratie, update of database-export ineens é in plaats van é en ’ in plaats van ’? De gegevens zijn bijna altijd nog gewoon aanwezig, ze worden alleen met de verkeerde codering gelezen. Mojibuster herstelt de export, daarna los je de oorzaak in de database op.

Werkt met tekst en met deze bestanden:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Bijvoorbeeld exports uit Excel, databaseback-ups, ondertitels of websitecode.

Herstellen

  1. Sleep een bestand hierheen of plak tekst
  2. Het herstellen gaat automatisch
  3. Kopieer of download
of sleep een bestand hierheen

Zo ziet het probleem eruit

Een regel uit een SQL-dump na een serververhuizing

Voor

INSERT INTO wp_posts (post_title) VALUES ('Café-menu – crème brûlée voor één');

Na

INSERT INTO wp_posts (post_title) VALUES ('Café-menu – crème brûlée voor één');

Waar het vandaan komt

WordPress slaat tekst op als UTF-8. Veel oudere installaties hebben hun tabellen echter als latin1 aangemaakt of verbinden met latin1. Zolang schrijven en lezen dezelfde fout maken, merkt niemand het. Na een verhuizing naar een nieuwe server, een export met phpMyAdmin of een wijziging van de verbindingstekenset wordt elke letter met accent ineens twee tekens.

  • DB_CHARSET in wp-config.php staat op latin1 of past niet bij de tabellen.
  • De dump is als latin1 geëxporteerd en als utf8mb4 geïmporteerd, of andersom.
  • Een plugin of importscript heeft al kapotte tekst nog een keer omgezet. Zo ontstaat dubbel gecodeerde tekst zoals é.

De export herstellen

  1. Maak een back-up van de database voordat je iets wijzigt.
  2. Exporteer de betreffende tabellen als .sql-bestand, bijvoorbeeld met phpMyAdmin of mysqldump --default-character-set=utf8mb4.
  3. Sleep het bestand naar het vak hierboven. Mojibuster herstelt alleen de kapotte plekken en laat elke wijziging zien.
  4. Download het herstelde bestand en importeer het met utf8mb4 in een lege testdatabase.
  5. Controleer de site. Ziet alles er goed uit, importeer het dan in de live database.

De dump wordt nooit geüpload, en dat is belangrijk: er staan meestal gebruikersaccounts, e-mailadressen en reacties in. Meer daarover voor bedrijven en functionarissen voor gegevensbescherming.

Pas op met geserialiseerde gegevens

WordPress bewaart sommige instellingen in wp_options en wp_postmeta als geserialiseerde PHP-waarden, bijvoorbeeld s:5:"Café";. Het getal is de lengte in bytes. Wordt é weer é, dan klopt die lengte niet meer en gooit WordPress de waarde weg. Herstel dus eerst inhoudstabellen als wp_posts, wp_comments en wp_terms. Voor opties is wp search-replace van WP-CLI beter, want dat past de lengtes aan.

De oorzaak in MySQL oplossen

  • Zet tabellen en verbinding om naar utf8mb4 en stel define('DB_CHARSET', 'utf8mb4'); in wp-config.php in.
  • Staan er UTF-8-bytes in een latin1-kolom, converteer die dan niet rechtstreeks: dat zou ze een tweede keer coderen. De gebruikelijke route loopt via een binair type: eerst MODIFY … LONGBLOB, daarna MODIFY … LONGTEXT CHARACTER SET utf8mb4.
  • Test elke wijziging eerst op een kopie van de database.

Veelgestelde vragen

Kan ik een hele WordPress-database in één keer herstellen?

Ja, ook grote SQL-dumps. Let wel op geserialiseerde gegevens in wp_options en wp_postmeta: WP-CLI regelt dat beter.

Worden correcte tekens in de dump aangepast?

Nee. Mojibuster herstelt alleen reeksen die duidelijk kapot zijn. Correcte tekst blijft zoals hij is.

Wat is het verschil tussen utf8 en utf8mb4?

In MySQL slaat utf8 alleen tekens van maximaal drie bytes op, waardoor emoji verloren gaan. utf8mb4 is echte UTF-8 en de juiste keuze voor WordPress.

Werkt dit ook voor andere systemen dan WordPress?

Ja. Joomla, Drupal, Magento of je eigen applicatie op MySQL of MariaDB hebben hetzelfde probleem en dezelfde oplossing.

Meer uitleg