MySQL's utf8
kodning er ikke faktiske UTF-8. Det er en kodning, der er lidt ligesom UTF-8, men som kun understøtter en delmængde af, hvad UTF-8 understøtter. utf8mb4
er faktisk UTF-8. Denne forskel er en intern implementeringsdetalje af MySQL. Begge ligner UTF-8 på PHP-siden. Om du bruger utf8
eller utf8mb4
, vil PHP få gyldig UTF-8 i begge tilfælde.
Det du skal sikre dig er, at forbindelseskodningen mellem PHP og MySQL er sat til utf8mb4
. Hvis den er indstillet til utf8
, MySQL understøtter ikke alle tegn. Du indstiller denne forbindelseskodning ved hjælp af mysql_set_charset()
, PDO charset
DSN-forbindelsesparameter eller en hvilken som helst anden metode, der passer til din valgte database-API.
mb_internal_encoding
indstiller bare standardværdien for $encoding
parameter alle mb_*
funktioner har. Det har intet at gøre med MySQL.
UTF-8 og UTF-32 adskiller sig i, hvordan de koder tegn. UTF-8 bruger et minimum på 1 byte for et tegn og maksimalt 4. UTF-32 altid bruger 4 bytes for hvert tegn. UTF-16 bruger minimum 2 bytes og maksimalt 4.
På grund af sin variable længde har UTF-8 en lille smule overhead. Et tegn, der kan kodes i 2 bytes i UTF-16, kan tage 3 eller 4 i UTF-8; på den anden side bruger UTF-16 aldrig mindre end 2 bytes. Hvis du gemmer masser af asiatisk tekst, kan UTF-16 bruge mindre lagerplads. Hvis det meste af din tekst er engelsk/ASCII, bruger UTF-8 mindre lagerplads. UTF-32 bruger altid mest lagerplads.