2010-09-03 6 views
10

मैं MySQL में एक रिकॉर्ड डालना चाहता हूं जिसमें एक गैर-ASCII यूनिकोड वर्ण है, लेकिन मैं टर्मिनल पर हूं जो मुझे आसानी से गैर-ASCII वर्ण टाइप करने देता है। मैं MySQL के SQL वाक्यविन्यास में यूनिकोड शाब्दिक से कैसे बचूं?MySQL यूनिकोड अक्षर

उत्तर

7

देखें: http://bugs.mysql.com/bug.php?id=10199 (बग # 10199: "स्ट्रिंग शाब्दिक के लिए अनुमति दें यूनिकोड एस्केप अनुक्रम।") यह अनुरोध "खोलें" कर दिया गया है 2005

के बाद से http://eng.kaching.com/2009/10/mysql-unicode-escape-sequences.html ही आप निम्न उदाहरण देख सकते हैं , जो वास्तव में काम करता प्रतीत होता है, लेकिन आपको वास्तविक बाइट-बाय-बाइट यूटीएफ 8 एन्कोडिंग जानने की आवश्यकता है:

"आप परिवर्तनीय-लंबाई यूटीएफ -8 प्रतिनिधित्व का भी उपयोग कर सकते हैं (उदाहरण के लिए, उदाहरण के लिए, एक से कॉपी करना utf-8 यूआरएल-एन्कोडेड मान जैसे% E2% 80% 98)। "

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

यह संग्रहीत समारोह एक तरह से पहले से ही UTF-8 एन्कोडिंग पता करने के लिए बिना एक चरित्र में एक शाब्दिक कोड बिंदु बारी करने के साथ, कार्यक्षमता MySQL है (जाहिरा तौर पर) लापता प्रदान करता है।

तो VARCHAR(1), अजीब लगता है के बाद से MySQL में UTF8 अक्षरों तक 3 बाइट्स लंबा हो सकता है आकार याद की VARCHARपात्रों, नहीं बाइट्स है। फ़ंक्शन इनपुट मान से एक एकल यूटीएफ -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

मैं ड्राइव से नीचे मतदाताओं ने, टिप्पणी के बिना, नीचे वोट जवाब है कि स्पष्ट रूप से सही हैं और के यादृच्छिक मूर्खता से चिढ़ परे एक छोटा सा हो रही है स्पष्ट रूप से काम करते हैं। यदि आप उत्तर को समझने के लिए पर्याप्त कुशल नहीं हैं और इसके लिए आपत्ति की व्याख्या करते हैं, तो कृपया इसे कम से कम दिखाएं। –

+0

ठीक काम करता है, धन्यवाद –

संबंधित मुद्दे