В чем различие между utf8mb4, UCS-4BE', 'UTF-32' PHP/MySQL?
Необходимо определить числовой номер UTF-символа.
unpack('N', mb_convert_encoding($utf8Character, 'UCS-4BE', 'UTF-8'))[1]; - это все работает.
также некоторые предлагают конвертить в 'UTF-32BE' - зачем?
в MySQL данные хранятся в utf8mb4. это 4 байта на символ.
Хочу понять, зачем необходимо конвертировать в UCS-4BE, если у нас итак данные храняться в 4 байтах гарантированно.
Если не конвретировать, конструкция не работает - почему?
И не совсем понял чем всетаки отличаются UCS-4BE и UTF-32?
Для правильного вопроса надо знать половину ответа
в MySQL данные хранять̷̸ся в utf8mb4. это 4 байта на символ
Не четыре, а от одного до четырёх.
чем все-таки отличаются UCS-4BE и UTF-32?
UTF-32 - это подмножество UCS-4. UCS-4 поддерживает символы с кодами от 0 до 7FFFFFFF, UTF-32 - с кодами от 0 до 10FFFF. Суффиксы LE и BE - определяют порядок записи байтов, Little-Endian и Big-Endian.
спсб. я это все прочитал, но не совсем понял, честно говоря. Тогда задам уточняющий вопрос. Для чего рекомендуют в MySQL переводить формат с UTF на UTF8mb4?
Предполагаю, что таким образом MySQL резервирует 4 байта? Тогда почему не в UTF32 хранить изначально, если расход памяти одинаковый!?
t9221823420, В MySQL utf8 поддерживает символы от 1 до 3 байт, что соответствует диапазону от 0 до FFFF в UCS-4. Чтобы сохранять символы от 10000 до 1FFFFF (например, эмодзи) надо добавить четвёртый байт, для чего и нужна кодировка utf8mb4.
Но длина символа в utf8 переменная, то есть в лучшем случае (ASCII-127) одному символу соответствует один байт. Русские буквы кодируются двумя байтами, эмодзи - четырьмя. MySQL не резервирует место под строки, оно выделяется динамически по фактической длине строки в байтах (не в символах).
В кодировке utf8mb4 длина символа варьируется от 1 до 4 байт. В кодировках UCS-4 и UTF-32 длина символа всегда 4 байта. Чем они отличаются можно прочитать в википедии https://en.wikipedia.org/wiki/UTF-32