2010-09-03 25 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