Tekencodering herstellen in MySQL en phpMyAdmin

Toont phpMyAdmin, je SQL-dump of je applicatie é of ? in plaats van é? Meestal sluiten tabel, verbinding en import niet op elkaar aan. Mojibuster herstelt exports direct in je browser, daarna stel je MySQL goed in.

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

Drie plekken waar MySQL een codering nodig heeft

  • Kolom of tabel: de tekenset waarin de gegevens staan, zoals utf8mb4 of latin1.
  • Verbinding: de tekenset waarin client en server met elkaar praten, in te stellen met SET NAMES utf8mb4 of in de verbindingsinstellingen.
  • Bestand: de codering waarmee een import wordt gelezen of een export wordt geschreven, in phpMyAdmin onder Tekenset van het bestand.

Als de drie niet overeenkomen, gaan tekens kapot. Het vaakst gebeurt dit zo: UTF-8-tekst is via een latin1-verbinding in een latin1-kolom geschreven. De applicatie ziet er goed uit, maar phpMyAdmin en de export tonen é.

Een regel uit een CSV-export van phpMyAdmin

Voor

"1","Zoë van der Heijden","Café-straat 12","Genève"

Na

"1","Zoë van der Heijden","Café-straat 12","Genève"

De tekensets controleren

  • SHOW VARIABLES LIKE 'character_set%'; toont de instellingen van server en verbinding.
  • SHOW CREATE TABLE klanten; toont de tekenset van de tabel en de kolommen.
  • SELECT naam, HEX(naam) FROM klanten LIMIT 5; toont de echte bytes: in een utf8mb4-kolom is C3A9 een é, terwijl C383C2A9 een al kapotte é is.

Een export of dump herstellen

  1. Exporteer de tabel in phpMyAdmin als SQL of CSV, of met mysqldump --default-character-set=utf8mb4.
  2. Sleep het bestand naar het vak hierboven. Mojibuster herstelt alleen de kapotte plekken; correcte tekens blijven ongemoeid.
  3. Controleer de herstelde plekken onder Wat is er veranderd? en download het bestand.
  4. Importeer het in een tabel met utf8mb4 en kies in het importvenster utf-8 als tekenset.
  5. Test eerst op een kopie voordat je de echte tabel vervangt.

De export verlaat je computer niet, wat belangrijk is bij klantgegevens. Staat er al dubbel gecodeerde tekst in? Lees dan à in plaats van accenten.

De oorzaak oplossen

  • Maak nieuwe tabellen aan met DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci.
  • Zet de verbinding van je applicatie op utf8mb4, in PHP bijvoorbeeld met charset=utf8mb4 in de PDO-DSN.
  • Staan er UTF-8-bytes in een latin1-kolom? Zet die dan niet direct om met CONVERT TO, want dan worden ze een tweede keer gecodeerd. De veilige weg loopt via een binair type: eerst MODIFY naam VARBINARY(255), dan MODIFY naam VARCHAR(255) CHARACTER SET utf8mb4.
  • Vervangt MySQL tekens door ?, dan kan de kolom of verbinding ze niet weergeven. Wat al zo is opgeslagen, is verloren: meer over vraagtekens in plaats van letters.

Veelgestelde vragen

Waarom ziet alles er in mijn applicatie goed uit, maar niet in phpMyAdmin?

Omdat applicatie en database twee keer dezelfde fout maken: de applicatie schrijft UTF-8 over een latin1-verbinding en leest het op dezelfde manier terug. phpMyAdmin verbindt wel goed en toont dus wat er echt staat. Was de tekst al dubbel gecodeerd, lees dan over dubbele codering, en bij een WordPress-site over de WordPress-database.

Welke collation moet ik gebruiken?

utf8mb4_unicode_ci past bij de meeste applicaties; sinds MySQL 8 is utf8mb4_0900_ai_ci de standaard. De tekenset utf8mb4 is belangrijker, niet utf8, want die kan in MySQL geen emoji opslaan.

Werkt dit ook met MariaDB?

Ja. MariaDB gaat met tekensets om zoals MySQL en de commando’s zijn hetzelfde.

Hoe groot mag de dump zijn?

Tot 100 MB per bestand. Exporteer grotere databases tabel voor tabel.

Meer uitleg