MySQL's utf8
codering is niet echte UTF-8. Het is een codering die een beetje op UTF-8 lijkt, maar alleen een subset ondersteunt van wat UTF-8 ondersteunt. utf8mb4
is werkelijk UTF-8. Dit verschil is een intern implementatiedetail van MySQL. Beide zien eruit als UTF-8 aan de PHP-kant. Of je nu utf8
. gebruikt of utf8mb4
, PHP krijgt in beide gevallen geldige UTF-8.
Wat u moet controleren, is dat de verbindingscodering tussen PHP en MySQL is ingesteld op utf8mb4
. Als het is ingesteld op utf8
, MySQL ondersteunt niet alle tekens. U stelt deze verbindingscodering in met mysql_set_charset()
, de BOB charset
DSN-verbindingsparameter of welke andere methode dan ook die geschikt is voor uw database-API naar keuze.
mb_internal_encoding
stelt gewoon de standaardwaarde in voor de $encoding
parameter alle mb_*
functies hebben. Het heeft niets te maken met MySQL.
UTF-8 en UTF-32 verschillen in de manier waarop ze tekens coderen. UTF-8 gebruikt een minimum van 1 byte voor een teken en maximaal 4. UTF-32 altijd gebruikt 4 bytes voor elk teken. UTF-16 gebruikt minimaal 2 bytes en maximaal 4.
Vanwege de variabele lengte heeft UTF-8 een beetje overhead. Een teken dat in UTF-16 in 2 bytes kan worden gecodeerd, kan in UTF-8 3 of 4 hebben; aan de andere kant gebruikt UTF-16 nooit minder dan 2 bytes. Als u veel Aziatische tekst opslaat, gebruikt UTF-16 mogelijk minder opslagruimte. Als de meeste van uw tekst Engels/ASCII is, gebruikt UTF-8 minder opslagruimte. UTF-32 gebruikt altijd de meeste opslagruimte.