Если цель состоит в том, чтобы указать кодовую точку вместо закодированной последовательности байтов (то есть 0x0F02
вместо UTF-8 0xE0BC82
для "& # x0F02;"), то вам необходимо использовать кодировку, в которой значение кодовой точки просто является кодированной последовательностью байтов. Например, «0xE28098» является байтовой последовательностью в кодировке UTF-8 для символа « & # x2018; » (как показано в ответе dkamins ), который является кодовой точкой U + 2018 , Однако 0x2018
является одновременно значением кодовой точки для ‘
и кодированной последовательности байтов для ucs2
/ utf16
(они фактически являются одинаковыми кодировками для символов BMP, но я предпочитаю использовать «utf16» в соответствии с «utf8» и «utf32», в теме «utf»). Следовательно:
_utf16 0x2018
возвращает тот же символ ‘
, что и:
_utf8 0xE0BC82
Но utf16
работает только для символов BMP (кодовые точки U + 0000 - U + FFFF) с точки зрения указания значения кодовой точки. Если вам нужен дополнительный символ (указав кодовую точку вместо последовательности байтов конкретной кодировки), вам нужно будет использовать кодировку utf32
. Не только _utf32 0x2018
возвращает ‘
, но и:
_utf32 0x1F47E
возвращает: & # x1F47E;
Для использования кодировок UTF-8 или UTF-16 для этого же дополнительного символа потребуется следующее:
_utf8mb4 0xF09F91BE
_utf16 0xD83DDC7E
ОДНАКО, если у вас возникли проблемы с добавлением этого в строку, уже являющуюся utf8, вам нужно будет преобразовать ее в utf8
(или в utf8mb4
при создании дополнительных символов, так как кодировка / кодировка utf8
может обрабатывать только символы BMP):
CONVERT(_utf32 0x1F47E USING utf8mb4)
Или, используя пример символа из Майкл - ответ sqlbot :
CONVERT(_utf32 0x2192 USING utf8)
возвращает →
. Следовательно, пользовательская функция не требуется для того, чтобы создавать кодированный символ UTF-8 из его кодовой точки (по крайней мере, не в MySQL 8.0). Вот тестовый запрос
SELECT _utf32 0x1F47E AS "Supplementary Character in utf32",
CONVERT(_utf32 0x1F47E USING utf8mb4) AS "Supplementary Character in utf8mb4",
CHARSET(CONVERT(_utf32 0x1F47E USING utf8mb4)) AS "Proof",
"---" AS "---",
_utf32 0x2192 AS "BMP character in utf32",
CONVERT(_utf32 0x2192 USING utf8) AS "BMP character in utf8",
CHARSET(CONVERT(_utf32 0x2192 USING utf8)) AS "Proof";
И вы можете видеть, что он работает на db <> fiddle (может не работать в MySQL до 8.0).
Более подробную информацию об этих параметрах, а также escape-последовательности Unicode для других языков и платформ см. В моем сообщении:
Unicode Escape-последовательности на разных языках и платформах (включая дополнительные символы)