UTF-8 är en kodning med variabel längd. I fallet med UTF-8 betyder detta att lagring av en kodpunkt kräver en till fyra byte. Men MySQL:s kodning som kallas "utf8" (alias för "utf8mb3") lagrar bara maximalt tre byte per kodpunkt.
Så teckenuppsättningen "utf8"/"utf8mb3" kan inte lagra alla Unicode-kodpunkter:den stöder bara intervallet 0x000 till 0xFFFF, som kallas "Basic Multilingual Plane ". Se även Jämförelse av Unicode-kodningar .
Detta är vad (en tidigare version av samma sida på) MySQL-dokumentationen har att säga om det:
Teckenuppsättningen med namnet utf8[/utf8mb3] använder maximalt tre byte per tecken och innehåller endast BMP-tecken. Från och med MySQL 5.5.3 använder teckenuppsättningen utf8mb4 maximalt fyra byte per tecken och stöder tilläggstecken:
För ett BMP-tecken har utf8[/utf8mb3] och utf8mb4 identiska lagringsegenskaper:samma kodvärden, samma kodning, samma längd.
För ett tilläggstecken kan utf8[/utf8mb3] inte lagra tecknet alls , medan utf8mb4 kräver fyra byte för att lagra det. Eftersom utf8[/utf8mb3] inte kan lagra tecknet alls, har du inga tilläggstecken i utf8[/utf8mb3] kolumner och du behöver inte oroa dig för att konvertera tecken eller förlora data när du uppgraderar utf8[/utf8mb3] data från äldre versioner av MySQL.
Så om du vill att din kolumn ska stödja lagring av tecken som ligger utanför BMP (och du vanligtvis vill), såsom emoji , använd "utf8mb4". Se även Vilka är de vanligaste icke-BMP Unicode-tecknen i faktisk användning? .