sql >> Base de Datos >  >> RDS >> Mysql

Cómo detectar caracteres UTF-8 en una columna codificada Latin1 - MySQL

La codificación de caracteres, como las zonas horarias, es una fuente constante de problemas.

Lo que puede hacer es buscar cualquier carácter "ASCII alto", ya que estos son caracteres o símbolos acentuados LATIN1, o el primero de un carácter multibyte UTF-8. Saber la diferencia no será fácil a menos que hagas un poco de trampa.

Para averiguar qué codificación es correcta, simplemente SELECT dos versiones diferentes y comparar visualmente. He aquí un ejemplo:

SELECT CONVERT(CONVERT(name USING BINARY) USING latin1) AS latin1, 
       CONVERT(CONVERT(name USING BINARY) USING utf8) AS utf8 
FROM users 
WHERE CONVERT(name USING BINARY) RLIKE CONCAT('[', UNHEX('80'), '-', UNHEX('FF'), ']')

Esto se vuelve inusualmente complicado porque el motor MySQL regexp parece ignorar cosas como \x80 y hace necesario usar el UNHEX() en su lugar.

Esto produce resultados como este:

latin1                utf8
----------------------------------------
Björn                Björn