2010-09-03 57 views
10

我想插入一条记录到具有非ASCII Unicode字符的MySQL,但我在终端上不让我轻松输入非ASCII字符。如何在MySQL的SQL语法中转义Unicode字面值?MySQL unicode literals

回答

7

参见:http://bugs.mysql.com/bug.php?id=10199 (错误#10199:“允许Unicode转义序列字符串文字。”) 这个请求已经被“打开”自2005年以来

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'; 
+---+ 
| ‘ | 
+---+ 
0

此存储的函数提供缺少的功能MySQL是(显然)中,用一种方法来把一个文字代码点为字符,而不必已经知道UTF-8编码。

如果VARCHAR(1)似乎很奇怪,因为在MySQL UTF8字符可以达到3个字节长,记住大小VARCHAR字符,不字节。该函数从输入值中返回一个单一的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) 
+1

我得到一点点超越激怒驱动通过向下选民谁,不加评论,反对票答案是显然是正确和随机愚蠢显然工作。如果您没有足够的技巧来理解答案并解释您的反对意见,请至少停止展示答案。 – 2016-04-19 09:27:20

+0

工作正常,谢谢 – 2017-01-26 06:51:38