2010-09-03 15 views
10

ASCII olmayan bir Unicode karakterine sahip MySQL'e bir kayıt eklemek istiyorum, ancak ASCII olmayan karakterleri kolayca yazmama izin veren bir terminalde yaşıyorum. MySQL'in SQL sözdizimindeki Unicode literalinden nasıl kurtulurum?MySQL unicode literals

cevap

7

Bkz: http://bugs.mysql.com/bug.php?id=10199 (Bug # 10199: "dize hazır Unicode kaçış dizisi izin verin.") aşağıdaki örnek görebilirsiniz olsa Bu istek http://eng.kaching.com/2009/10/mysql-unicode-escape-sequences.html itibaren 2005

beri "Aç" olmuştur hangi aslında çalışmak gibi görünüyor, ama gerçek bayt-bayt UTF8 kodlaması bilmek gerektirir:

"Ayrıca gelen zaman, örneğin, kopyalama uygun değişken uzunlukta UTF8 temsilini (kullanabilirsiniz utf-8 URL kodlu değer% E2% 80% 98 gibi. "

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

Bu saklı fonksiyon zaten UTF-8 kodlamasını bilmek zorunda kalmadan bir karaktere dönüştürür değişmez kod noktasını açmak için bir yol, eksik (görünüşte) MySQL işlevsellik sağlar. MySQL utf8 karakterleri, en fazla 3 bayt uzunluğunda olması VARCHARkarakter değil bayt olduğunu boyutunu bildim bileli

VARCHAR(1) ise garip görünüyor. İşlev, giriş değerinden tek bir UTF-8 kodlu karakter döndürür.

Onaltılık literaller için 0x'u ekleyin.

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 ; 

Örnek çıkışı:

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

Ben arabadan açılan, yorum yapmadan, aşağı-oy besbelli doğru cevaplar ve-seçmenlerin aşağı rastgele aptallık rahatsız ötesinde biraz alıyorum Açıkçası işe yarıyor. Cevabı anlamak ve itirazınızı açıklamak için yeterli beceriye sahip değilseniz, en azından bunu göstermeyi bırakın. –

+0

iyi çalışıyor, teşekkürler –