Вставка суррогатной пары в MySQL с помощью инструкции INSERT

Я пытаюсь вставить суррогатную пару ('????', \uD852\uDF62, то же, что и U+24B62 из этот пример) в MySQL.

INSERT с неэкранированным литералом, предложенным этим ответом:

INSERT INTO unicode_test (value) VALUES ('????');
-- or
INSERT INTO unicode_test (value) VALUES (_utf8'????');

терпит неудачу с

Error Code: 1366. Incorrect string value: '\xF0\xA4\xAD\xA2' for column 'value' at row 1

(обратите внимание, что \xF0\xA4\xAD\xA2 даже близко не соответствует исходному значению \uD852\uDF62).

С другой стороны, оба

INSERT INTO unicode_test (value) VALUES (_utf16'????');

и

INSERT INTO unicode_test (value) VALUES (_utf8mb4'????');

успешно, но вставленные значения отличаются от исходных.

Моя база данных использует набор символов utf8mb4, поэтому я предполагаю, что она должна прозрачно обрабатывать суррогаты.

Каков рекомендуемый способ вставки символов, отличных от BMP, в MySQL?


person Bass    schedule 02.08.2017    source источник
comment
\xF0\xA4\xAD\xA2 — это UTF-8 выражение кода U+24b62 (или \uD852\uDF62 в UTF-16).   -  person JosefZ    schedule 02.08.2017
comment
Другая ссылка: unicode.scarfboy.com/?s=%F0%A4 %AD%A2   -  person Rick James    schedule 14.08.2017


Ответы (1)


Используйте CHARACTER SET utf8mb4, а не utf8 или utf16.

См. «Рекомендации» в http://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored Похоже, у вас нет параметра подключения (или SET NAMES).

То, что вы пробовали, должно было сработать:

INSERT INTO unicode_test (value) VALUES ('????');

Другой подход

INSERT INTO unicode_test (value) VALUES (UNHEX('F0A4ADA2'));
person Rick James    schedule 13.08.2017