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
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';
+---+
| ‘ |
+---+
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. Literales de caracteres Unicode (hexadecimales) en MySQL
- 2. Cómo decodificar literales sin procesar unicode a una cadena legible?
- 3. Sustitución dentro de literales literales literales? .
- 4. Cómo almacenar unicode en MySQL?
- 5. Escapar literales de cadena literales
- 6. MySQL no desea almacenar caracteres Unicode
- 7. Python y MySql: Unicode y codificación
- 8. de codificación utilizado para u "" literales
- 9. Cómo descubrir qué página de códigos usar al convertir literales hexadecimales RTF a Unicode
- 10. Literales booleanos en PowerShell
- 11. literales XML en JavaScript?
- 12. Comparación de NSNumber literales
- 13. Buscando Literales de Cadenas
- 14. Alcance de (cadena) literales
- 15. hash literales en C#?
- 16. grandes literales enteros negativos
- 17. Interral string literales malentendido?
- 18. Grep para cadenas literales
- 19. literales enteros largos
- 20. Cadenas literales C++?
- 21. Clojure Función Literales
- 22. ¿Se pueden definir tablas "literales" en SQL?
- 23. matrices de literales en CoffeeScript
- 24. SPARQL: combinando variables con literales
- 25. Literales de fecha en Hibernate
- 26. Palabras clave "nativas" y "literales"
- 27. Scala Literales funcionales con Implicits
- 28. optimización de cadenas literales C
- 29. MySQL modo booleano búsqueda de texto completo con comodines y literales
- 30. Unicode Portabilidad
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. –
funciona bien, gracias –