MySQL:s utf8
kodning är inte faktiska UTF-8. Det är en kodning som är ungefär som UTF-8, men som bara stöder en delmängd av vad UTF-8 stöder. utf8mb4
är verklig UTF-8. Denna skillnad är en intern implementeringsdetalj av MySQL. Båda ser ut som UTF-8 på PHP-sidan. Oavsett om du använder utf8
eller utf8mb4
, PHP kommer att få giltig UTF-8 i båda fallen.
Det du behöver se till är att anslutningskodningen mellan PHP och MySQL är satt till utf8mb4
. Om den är inställd på utf8
, MySQL kommer inte att stödja alla tecken. Du ställer in denna anslutningskodning med mysql_set_charset()
, PDO charset
DSN-anslutningsparameter eller vilken annan metod som helst som är lämplig för ditt valda databas-API.
mb_internal_encoding
ställer bara in standardvärdet för $encoding
parameter alla mb_*
funktioner har. Det har inget med MySQL att göra.
UTF-8 och UTF-32 skiljer sig åt i hur de kodar tecken. UTF-8 använder ett minimum på 1 byte för ett tecken och högst 4. UTF-32 alltid använder 4 byte för varje tecken. UTF-16 använder minst 2 byte och maximalt 4.
På grund av sin varierande längd har UTF-8 lite overhead. Ett tecken som kan kodas i 2 byte i UTF-16 kan ta 3 eller 4 i UTF-8; å andra sidan använder UTF-16 aldrig mindre än 2 byte. Om du lagrar mycket asiatisk text kan UTF-16 använda mindre lagringsutrymme. Om det mesta av din text är engelska/ASCII, använder UTF-8 mindre lagringsutrymme. UTF-32 använder alltid mest lagringsutrymme.