utf8
MySQL kodowanie nie rzeczywisty UTF-8. Jest to kodowanie podobne do UTF-8, ale obsługuje tylko podzbiór tego, co obsługuje UTF-8. utf8mb4
jest rzeczywiste UTF-8. Ta różnica jest szczegółem implementacji wewnętrznej MySQL. Oba wyglądają jak UTF-8 po stronie PHP. Czy używasz utf8
lub utf8mb4
, PHP otrzyma poprawny kod UTF-8 w obu przypadkach.
Musisz się upewnić, że kodowanie połączenia między PHP a MySQL jest ustawiona na utf8mb4
. Jeśli jest ustawiony na utf8
, MySQL nie obsługuje wszystkich znaków. Ustawiasz to kodowanie połączenia za pomocą mysql_set_charset()
, PDO charset
Parametr połączenia DSN lub jakakolwiek inna metoda jest odpowiednia dla wybranego interfejsu API bazy danych.
mb_internal_encoding
po prostu ustawia domyślną wartość dla $encoding
parametr wszystkie mb_*
funkcje mają. Nie ma to nic wspólnego z MySQL.
UTF-8 i UTF-32 różnią się sposobem kodowania znaków. UTF-8 używa minimum 1 bajt na znak i maksymalnie 4. UTF-32 zawsze używa 4 bajtów na każdy znak. UTF-16 używa co najmniej 2 bajtów, a maksymalnie 4.
Ze względu na zmienną długość, UTF-8 ma trochę narzutu. Znak, który można zakodować na 2 bajty w UTF-16, może mieć 3 lub 4 w UTF-8; z drugiej strony, UTF-16 nigdy nie używa mniej niż 2 bajty. Jeśli przechowujesz dużo tekstu azjatyckiego, UTF-16 może zużywać mniej miejsca. Jeśli większość tekstu jest w języku angielskim/ASCII, UTF-8 zajmuje mniej miejsca. UTF-32 zawsze zajmuje najwięcej miejsca.