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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
ALTER DATABASE <databasenaam> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

C. stel de encoding in van alle tabellen met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
ALTER TABLE <tabelnaam> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

D. pas waar nodig de kolommen aan op dezelfde manier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
ALTER TABLE <tabelnaam> CHANGE <kolomnaam> <kolomnaam> <definitie> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$db
= new mysqli($host, $account, $password, $database);
$db->set_charset('utf8mb4');
?>


PostgreSQL voorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$db
= pg_connect("host=localhost options='--client_encoding=UTF8'");
?>


PDO voorbeeld met PostgreSQL:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$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

« Lees de omschrijving en reacties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.