2010-11-23 14 views
6

¿Hay alguna manera de especificar literales de caracteres Unicode en MySQL?Literales de caracteres Unicode (hexadecimales) en MySQL

quiero reemplazar un carácter Unicode con un carácter ASCII, algo así como lo siguiente:

Update MyTbl Set MyFld = Replace(MyFld, "ẏ", "y") 

Pero estoy usando caracteres aún más oscura que no están disponibles en la mayoría de las fuentes, por lo que quieren estar capaz de utilizar literales de caracteres Unicode, algo así como

Update MyTbl Set MyFld = Replace(MyFld, "\u1e8f", "y") 

Esta instrucción SQL se invoca desde un script PHP - la primera forma no sólo es ilegible, pero en realidad no funciona!

Respuesta

3

Gracias por sus sugerencias, pero creo que el problema era más atrás en el sistema.

Hay una gran cantidad de niveles de deshacer, pero por lo que puedo decir, (en este servidor al menos) el comando

set names utf8 

hace que el trabajo de manejo de UTF-8 correctamente, mientras que

set character set utf8 

no.

En mi entorno, estos se llaman desde PHP utilizando PDO, por la diferencia que puede hacer.

¡Gracias de todos modos!

0

La sintaxis de la cadena MySQL se especifica here, como puede ver, no hay ninguna provisión para secuencias de escape numéricas.

Sin embargo, como está integrando el SQL en PHP, puede calcular los bytes correctos en PHP. Asegúrate de que los bytes que colocas en el SQL realmente coincidan con tu client character set.

2

Puede utilizar los hex y unhex funciones, por ejemplo .:

update mytable set myfield = unhex(replace(hex(myfield),'C383','C3')) 
0

También está el char function que permitirá lo que usted desea (proporcionando números de bytes y un nombre de conjunto de caracteres) y obteniendo un carácter.

3

Puede especificar hexadecimal literals (o incluso binary literals) usando 0x, x'', o X'':

select 0xC2A2; 
select x'C2A2'; 
select X'C2A2'; 

Pero ser consciente que el tipo de retorno es una cadena binaria, por lo que todos y cada byte se considera una personaje.Esto se puede comprobar con char_length:

select char_length(0xC2A2) 

2

Si desea UTF-8 cadenas en lugar, es necesario utilizar convert:

select convert(0xC2A2 using utf8mb4) 

y podemos ver que C2 A2 es considerado 1 personaje en UTF-8:

select char_length(convert(0xC2A2 using utf8mb4)) 

1


Además, usted no tiene que preocuparse de bytes no válidos porque convert se eliminarán de forma automática:

select char_length(convert(0xC1A2 using utf8mb4)) 

0

Como puede verse, la salida es 0 porque C1 A2 es una secuencia de bytes UTF-8 no válida.

Cuestiones relacionadas