utf8
на MySQL кодирането не действителен UTF-8. Това е кодиране, което е нещо като UTF-8, но поддържа само подмножество от това, което поддържа UTF-8. utf8mb4
е действителен UTF-8. Тази разлика е вътрешен детайл за внедряването на MySQL. И двете изглеждат като UTF-8 от страна на PHP. Независимо дали използвате utf8
или utf8mb4
, PHP ще получи валиден UTF-8 и в двата случая.
Това, което трябва да сте сигурни, е кодирането на връзката между PHP и MySQL е настроен на utf8mb4
. Ако е настроен на utf8
, MySQL няма да поддържа всички знаци. Вие задавате това кодиране на връзката с помощта на mysql_set_charset()
, PDO charset
Параметър за връзка с DSN или какъвто и да е друг метод е подходящ за избрания от вас API на базата данни.
mb_internal_encoding
просто задава стойността по подразбиране за $encoding
параметър всички mb_*
функции имат. Няма нищо общо с MySQL.
UTF-8 и UTF-32 се различават по начина, по който кодират знаци. UTF-8 използва минимум от 1 байт за знак и максимум 4. UTF-32 винаги използва 4 байта за всеки знак. UTF-16 използва минимум 2 байта и максимум 4.
Поради променливата си дължина, UTF-8 има малко излишни разходи. Знак, който може да бъде кодиран в 2 байта в UTF-16, може да заема 3 или 4 в UTF-8; от друга страна, UTF-16 никога не използва по-малко от 2 байта. Ако съхранявате много азиатски текст, UTF-16 може да използва по-малко място за съхранение. Ако по-голямата част от текста ви е английски/ASCII, UTF-8 използва по-малко място за съхранение. UTF-32 винаги използва най-много място за съхранение.