В MySQL литералы Юникод

Я хочу вставить запись в MySQL, которая имеет символ Unicode без ASCII, но я нахожусь на терминале, который не позволяет мне легко вводить символы без ASCII. Как избежать литерала Unicode в синтаксисе SQL MySQL?

2 ответов


см.:http://bugs.mysql.com/bug.php?id=10199 (Ошибка #10199: "разрешить escape-последовательность Unicode для строковых литералов.") Эта просьба "открыта" с 2005 года.

от http://eng.kaching.com/2009/10/mysql-unicode-escape-sequences.html хотя вы можете увидеть следующий пример, который действительно работает, но требует, чтобы вы знали фактическую байтовую кодировку UTF8:

" вы также можете использовать переменную длину UTF-8 представление (удобно, когда, например, копирование из URL-кодированного значения utf-8, например %E2%80%98)."

mysql> select _utf8 x'E28098';
+---+
| ‘ |
+---+

эта сохраненная функция обеспечивает функциональность MySQL (по-видимому) отсутствует, с возможностью превратить буквальную кодовую точку в символ без необходимости уже знать кодировку UTF-8.

если VARCHAR(1) Кажется странным, так как символы utf8 в MySQL могут быть длиной до 3 байт, помните размер VARCHAR is символы, а не байт. Функция возвращает один символ в кодировке UTF-8 из входного значения.

для шестнадцатеричных литералы, добавь 0x.

DELIMITER $$

DROP FUNCTION IF EXISTS `utf8_char` $$
CREATE FUNCTION `utf8_char`(v smallint unsigned) RETURNS VARCHAR(1) CHARSET utf8
NO SQL
DETERMINISTIC
BEGIN

-- http://stackoverflow.com/questions/3632410/mysql-unicode-literals/30675371#30675371

RETURN CHAR(CASE
            WHEN v <= 0x7F THEN v
            WHEN v <= 0x7FF THEN 0xC080 | ((v >> 6) << 8) | (v & 0x3F)
            WHEN v <= 0xFFFF THEN 0xE08080 | (((v >> 12) & 0x0F ) << 16)  | (((v >> 6) & 0x3F ) << 8) | (v & 0x3F)
            ELSE NULL END);

END $$

DELIMITER ;

пример:

mysql> select utf8_char(8592) AS 'leftwards_arrow';
+-----------------+
| leftwards_arrow |
+-----------------+
| ←               |
+-----------------+
1 row in set (0.00 sec)

mysql> select utf8_char(0x2192) AS 'rightwards_arrow_hex';
+----------------------+
| rightwards_arrow_hex |
+----------------------+
| →                    |
+----------------------+
1 row in set (0.00 sec)