WordPress og databaseeksporter: ø og ’ i stedet for ø og ’

Viser dine indlæg pludselig ø i stedet for ø og ’ i stedet for ’ efter en flytning, opdatering eller databaseeksport? Dataene er næsten altid stadig der – de læses bare med den forkerte tegnkodning. Mojibuster retter eksporten, og bagefter løser du årsagen i databasen.

Virker med tekst og med disse filer:

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

For eksempel eksporter fra Excel, databasebackups, undertekster eller kode fra hjemmesider.

Ret

  1. Træk en fil herind, eller sæt tekst ind
  2. Rettelsen sker automatisk
  3. Kopiér eller download
eller træk en fil herind

Sådan ser problemet ud

En linje fra en SQL-dump efter flytning til ny server

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_CHARSET i wp-config.php er latin1 eller passer ikke til tabellerne.
  • Dumpet blev eksporteret som latin1 og importeret som utf8mb4 – eller omvendt.
  • Et plugin eller importscript konverterede allerede ødelagt tekst endnu en gang. Så opstår dobbeltkodet tekst som ø.

Ret eksporten

  1. Tag en sikkerhedskopi af databasen, før du ændrer noget.
  2. Eksportér de berørte tabeller som .sql-fil, for eksempel med phpMyAdmin eller mysqldump --default-character-set=utf8mb4.
  3. Træk filen ind i feltet ovenfor. Mojibuster retter kun de ødelagte steder og viser dig hver ændring.
  4. Download den rettede fil, og importér den med utf8mb4 i en ny testdatabase.
  5. 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æt define('DB_CHARSET', 'utf8mb4'); i wp-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ørst MODIFY … LONGBLOB, derefter MODIFY … 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.

Læs mere