2010-09-03 14 views
10

Chcę wstawić rekord do MySQL, który ma znak Unicode w standardzie innym niż ASCII, ale jestem na terminalu, który nie pozwala mi łatwo wpisywać znaków spoza ASCII. Jak mogę uniknąć literału Unicode w składni SQL MySQL?Literały w Unicode MySQL

Odpowiedz

7

Patrz: http://bugs.mysql.com/bug.php?id=10199 (Bug # 10199: "Pozwól sekwencję escape Unicode dla napisowych"). Wniosek ten został "Open" od 2005 roku

Od http://eng.kaching.com/2009/10/mysql-unicode-escape-sequences.html choć można zobaczyć następujący przykład , który faktycznie działa, ale wymaga znajomości aktualnego kodowania kodowania UTF8 bajt po bajcie:

"Można również użyć reprezentacji UTF-8 o zmiennej długości (wygodnej, gdy na przykład kopiowanie z utf-8 zakodowana wartość URL jak% E2% 80% 98). "

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

Funkcja ta zapewnia funkcjonalność przechowywane MySQL jest (podobno) brakuje, ze taki sposób, aby włączyć literalnego punktu kodeksu w charakterze bez konieczności już znać kodowanie UTF-8.

Jeśli VARCHAR(1) wydaje się dziwne, ponieważ znaków UTF8 w MySQL może mieć długość do 3 bajtów, należy pamiętać o wielkości od VARCHAR jest znaków, nie bajtów. Funkcja zwraca pojedynczy znak UTF-8 z wartości wejściowej.

W przypadku heksadecymalnych literałów należy dodać 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 ; 

Przykâadowa:

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

Dostaję trochę poza podrażniona przez losową głupoty drive-by, który bez komentarza, ODPOWIEDZI dół uznali, że są oczywiście poprawne and-down wyborców oczywiście praca. Jeśli nie masz wystarczających umiejętności, by zrozumieć odpowiedź i wyjaśnić swój sprzeciw, przynajmniej przestań to pokazywać. –

+0

działa dobrze, dzięki –