2010-09-03 15 views
10

Quiero insertar un registro en MySQL que tenga un carácter no ASCII Unicode, pero estoy en un terminal que no me permite escribir fácilmente caracteres que no sean ASCII. ¿Cómo puedo escapar de un literal Unicode en la sintaxis SQL de MySQL?Literales unicode MySQL

Respuesta

7

Ver: http://bugs.mysql.com/bug.php?id=10199 (Bug # 10199: "Permitir secuencia de escape Unicode para cadenas literales.") Esta solicitud ha sido "abierto" desde 2005.

De http://eng.kaching.com/2009/10/mysql-unicode-escape-sequences.html aunque se puede ver el siguiente ejemplo , que realmente parece funcionar, pero requiere que usted conozca la codificación UTF8 byte a byte real:

"También puede usar la representación UTF-8 de longitud variable (conveniente cuando, por ejemplo, copia desde valor utf-8 URL-codificado como% E2% 80% 98). "

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

Esta función almacenada proporciona la funcionalidad de MySQL es (aparentemente) que faltan, con una manera de convertir un punto de código literal en un personaje sin tener que saber ya la codificación UTF-8.

Si VARCHAR(1) parece extraño, ya que los caracteres utf8 en MySQL pueden ser de hasta 3 bytes de longitud, recordar el tamaño de VARCHAR es caracteres, no bytes. La función devuelve un único carácter codificado en UTF-8 desde el valor de entrada.

Para literales hexadecimales, anteponga 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 ; 

Ejemplo de salida:

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

me estoy poniendo un poco más allá irritada por la estupidez aleatoria de drive-by-abajo votantes que, sin comentarios, respuestas abajo-voto que son obviamente correcta y obviamente trabajo. Si no tiene la destreza suficiente para comprender la respuesta y explicarle su objeción, por favor deje de mostrarla, al menos. –

+0

funciona bien, gracias –