✦ Oplossingen · Database (MySQL/MariaDB)

MySQL: Incorrect string value (emoji en utf8mb4)

'ERROR 1366: Incorrect string value: '\xF0\x9F…' for column' komt door een kolom in utf8 (utf8mb3) die geen emoji aankan. Zo zet je tabel, kolom én verbinding om naar utf8mb4.

Waarom gebeurt dit?

In MySQL is de oude tekenset utf8 eigenlijk utf8mb3: maximaal drie bytes per teken. Emoji en sommige andere tekens hebben er vier nodig. Probeer je die op te slaan, dan geeft de server Incorrect string value: '\xF0\x9F\x98\x80' for column 'bericht', of verandert het teken stilletjes in een vraagteken.

De oplossing is utf8mb4, en dan op drie plekken tegelijk: de kolom of tabel, de standaard van de database, en de verbinding tussen je applicatie en de server. Mist er één, dan blijft het misgaan.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Controleer de tekenset van tabel en kolommen

    Kijk welke tekenset en collatie er nu gebruikt worden.

    SHOW CREATE TABLE berichten;
    SHOW VARIABLES LIKE 'character_set%';
  2. Maak een back-up

    Het omzetten herschrijft de tabel. Maak eerst een kopie.

    mysqldump -u root -p --default-character-set=utf8mb4 databasenaam > voor-utf8mb4.sql
  3. Zet database en tabel om

    Zet de standaard van de database en converteer de tabel. Kies een collatie die je server ondersteunt, bijvoorbeeld utf8mb4_unicode_ci.

    ALTER DATABASE databasenaam CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    ALTER TABLE berichten CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  4. Zet ook de verbinding op utf8mb4

    In PHP met PDO geef je de tekenset op in de DSN; bij mysqli met set_charset. In WordPress staat het in wp-config.php (DB_CHARSET).

    <?php
    $pdo = new PDO('mysql:host=localhost;dbname=databasenaam;charset=utf8mb4', $gebruiker, $wachtwoord);
    
    // mysqli
    $db->set_charset('utf8mb4');
    
    // WordPress, wp-config.php
    define( 'DB_CHARSET', 'utf8mb4' );
  5. Let op lange geïndexeerde kolommen

    Een index op een VARCHAR(255) in utf8mb4 kan bij oudere instellingen te groot worden. Zie Specified key was too long.

Let op: Zie je in de mysql-opdrachtregel een vraagteken waar een emoji hoort, controleer dan eerst met HEX(kolom) wat er echt is opgeslagen. Soms is de data goed en toont alleen de terminal het verkeerd.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Waarom zie ik ??? in plaats van emoji?

Het teken is al bij het opslaan omgezet, of de verbinding gebruikt een andere tekenset dan de tabel. Controleer alle drie de plekken.

Moet ik alle tabellen omzetten?

Alle tabellen waarin gebruikers tekst invoeren, zeker. Doe het consequent, zodat joins tussen tabellen niet over verschillende collaties struikelen.

Is utf8mb4 langzamer?

Het verschil is voor gewone websites niet merkbaar. Het belangrijkste is dat je data klopt.