18

我想在 MySQL 中插入一条具有非 ASCII Unicode 字符的记录,但我在一个不允许我轻松输入非 ASCII 字符的终端上。如何在 MySQL 的 SQL 语法中转义 Unicode 文字?

4

3 回答 3

9

请参阅:http ://bugs.mysql.com/bug.php?id= 10199(错误#10199:“允许字符串文字的 Unicode 转义序列。”)自 2005 年以来,此请求已“打开”。更多详细信息请参阅工作日志任务#3529:Unicode 转义序列

但是,从https://web.archive.org/web/20091117221116/http://eng.kaching.com/2009/10/mysql-unicode-escape-sequences.html ,您可以看到以下示例,实际上似乎可行,但需要您知道实际的逐字节 UTF8 编码:

您还可以使用可变长度的 UTF-8 表示(例如,从 utf-8 URL 编码的值(如 %E2%80%98)复制时很方便)。

mysql> select _utf8 x'E28098';  
+---+  
| ‘ |  
+---+  
于 2010-09-03T01:32:29.347 回答
2

这个存储函数提供了 MySQL (显然)缺少的功能,可以将文字代码点转换为字符,而无需知道 UTF-8 编码。

如果VARCHAR(1)看起来很奇怪,因为 MySQL 中的 utf8 字符最长可达 3 个字节,请记住大小VARCHARcharacters,而不是bytes。该函数从输入值返回单个 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)
于 2015-06-05T20:32:24.880 回答
2
于 2019-06-27T14:03:51.593 回答