MySQL/MariaDB en utf8

Auteur Twisted Bytes op 4 Maart 2015

Wie heeft het niet meegemaakt: je tekst komt niet uit de database zoals je het erin hebt gezet. Een é wordt ineens een é…

Iedereen die met MySQL en PHP heeft gewerkt kent het probleem en heeft er oorlogsverhalen over. Spreek het woord karakter-set uit en de overlevenden zullen je horror verhalen vertellen. En de schuldige in dit verhaal is niet PHP.

Iedereen die MySQL heeft gebruik zal deze tekst wel eens ergens gezien hebben: latin1_swedish_ci. MySQL is origineel gemaakt door Michael Widenius en deed dit in Zweden. En toen het gemaakt wisten we nog niet veel beter dan dat een letter in 8 bits past. Uiteraard is dit niet waar. Daarom is UTF-8 bedacht en nu eigenlijk de standaard. En iedereen gebruikt dit, toch….???

Standaard stellen wij onze database servers, databases en database client in op utf8. En we dachten dat we daar goed mee zaten. Tot we deze blog lazen: https://mathiasbynens.be/notes/mysql-utf8mb4.

Het blijkt dus dat MySQL en daarmee ook MariaDB in de karakter-set utf8 maximaal maar 3 bytes per teken gebruikt om het in de database op te slaan. Maar met utf8 wordt per teken soms 4 bytes gebruikt. En dan gaat het mis in MySQL.

We zaten dus niet goed met onze standaard instelling voor utf8, we moesten utf8mb4 gaan gebruiken. Wij hebben deze aanpassing, waar het kon, doorgevoerd op onze MariaDB servers en standaard worden alle nieuwe MariaDB servers met utf8mb4 ingesteld.

Hierdoor kunt u er op vertrouwen dat die é niet meer gaan langskomen. U heeft toch wel de utf-8 meta-tag boven in de HTML staan?

<meta charset="utf-8">

Om ervoor te zorgen dat uw ontwikkel databases ook gebruik maken van de goede karakter set kunt u die op database servers deze instellingen doen:

[mysqld]
...
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
...

En bij het aanmaken van de tabellen en kolommen altijd utf8mb4 gebruiken.

Tags: , ,