Databases
Gegevens
Ook databases hebben bij alle tekstuele data een encoding nodig om te weten wat de data betekent, en hoe te transcoden.
Het meest praktisch is om al deze data ook in UTF-8 te houden:
- standaardencoding van de database en eventueel het schema
- standaardencoding (eventueel geërfd van de database) van de tabellen
- standaardencoding (eventueel geërfd van de tabel) van de kolommen
Meestal wordt PHP gecombineerd met MySQL aangeboden, en soms is MySQL vervangen door de fork MariaDB.
Beide databases kennen de twee encodings "utf8" en "utf8mb4". Alleen "utf8mb4" ondersteunt de volledig Unicode set, "utf8" ondersteunt ruim 1 miljoen codepoints minder. MySQL ondersteunt "utf8mb4" vanaf versie 5.5.3 uit 2010, we gaan er van uit dat de meesten hierover beschikken.
Zie ook: https://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-3.html
Omzetten
Bij een bestaande applicatie is het handig om ook de data om te zetten naar UTF-8. Dat kan een hele klus zijn afhankelijk van hoe groot en complex de database is. Hoe het precies moet verschilt per database.
Voor MySQL:
A. maak een backup van de database
B. stel de encoding in van de database met
C. stel de encoding in van alle tabellen met
D. pas waar nodig de kolommen aan op dezelfde manier:
E. check of de lengte van kolommen en indices nog volstaat
In tegenstelling tot andere databases als PostgreSQL is de grootte in MySQL aangegeven met het aantal bytes, en dus niet het aantal karakters. Een kolom van het type VARCHAR(255) biedt in het beste geval ruimte aan 255 karakters, maar in het slechtste geval 42 karakters.
F. doe een REPAIR en OPTIMIZE voor elke tabel, of gebruik hiervoer de CLI-tool mysqlcheck met de opties --auto-repair --optimize.
Verbinding
Vanuit PHP gebruik je een extentie om de database server te bereiken. De extentie is doorgaans een API-wrapper om de client library van de database server. Vanuit PHP heb je dan eigenlijk een database client, met de losse eindjes (functies) in PHP waarvan je zelf mag weten hoe je ze gebruikt. Met deze client maak je een verbinding naar de database server, en nu komt het: die heeft een encoding van zichzelf. Zowel de database server als de client library zullen alle tekstuele data automatisch transcoden naar de encoding van de verbinding.
Omdat we transcoding het liefst helemaal vermijden moet ook de encoding van de verbinding worden ingesteld op UTF-8.
Dat doen we direct bij of net na de totstandkoming van de verbinding.
Hoe dat precies moet hangt af van de extentie in PHP (de API naar de client library)
MySQLi voorbeeld:
2
3
4
$db = new mysqli($host, $account, $password, $database);
$db->set_charset('utf8mb4');
?>
PostgreSQL voorbeeld:
PDO voorbeeld met PostgreSQL:
2
3
$db = new PDO("pgsql:host=<host>;dbname=<database>;options='--client_encoding=UTF8'");
?>
Is de encoding eenmaal ingesteld dan hoeven we verder niet langer na te denken en zal de data zonder encoding-problemen worden geschreven en gelezen.
Zie ook: http://php.net/manual/en/refs.database.php
Inhoudsopgave
- Inleiding
- Over Unicode
- PHP en UTF-8
- Tekstbestanden
- Databases
- Overige in- en uitvoer
- Verwerking in PHP
- Conclusie