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
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';
+---+
| ‘ |
+---+
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ı VARCHAR
karakter 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)
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. –
iyi çalışıyor, teşekkürler –