Pregunta

¿Hay una manera de especificar literales de caracteres Unicode en MySQL?

quiero reemplazar un carácter Unicode con un carácter ASCII, algo 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 quiero ser 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 trabajo

¿Fue útil?

Solución 2

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

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

set names utf8

hace que el trabajo de manipulación UTF-8 correctamente, mientras que

set character set utf8

no.

En mi entorno, éstas están llamadas a partir de PHP usando PDO, por lo que la diferencia que puede hacer.

Gracias de todos modos!

Otros consejos

Puede especificar hexadecimal literales (o incluso binario literales ) usando 0x, x'', o X'':

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

Pero tener en cuenta que el tipo de retorno es una cadena binaria, por lo que todos y cada byte es considerado un personaje. Esto se puede comprobar con char_length:

select char_length(0xC2A2)
  

2

Si desea UTF-8 cadenas en lugar, es necesario el uso < a href = "http://dev.mysql.com/doc/refman/5.7/en/charset-convert.html" rel = "noreferrer"> convert :

select convert(0xC2A2 using utf8mb4)

Y podemos ver que se considera C2 A2 1 carácter 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 los eliminará de forma automática:

select char_length(convert(0xC1A2 using utf8mb4))
  

0

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

Puede utilizar las funciones href="http://dev.mysql.com/doc/refman/5.7/en/string-functions.html" rel="nofollow"> hex y unhex , por ejemplo:

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

La sintaxis de la cadena de MySQL se especifica aquí , como se puede ver, no hay ninguna disposición para secuencias de escape numéricos.

Sin embargo, como está incrustando el SQL en PHP, usted puede calcular los bytes correctos en PHP. Asegúrese de que los bytes que puso en el SQL realidad coincida con su conjunto de caracteres cliente .

También existe la char función que la voluntad permite que lo que quería (que proporciona los números de bytes y un nombre de conjunto de caracteres) y conseguir un char.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top