Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment détecter les caractères UTF-8 dans une colonne encodée Latin1 - MySQL

L'encodage des caractères, comme les fuseaux horaires, est une source constante de problèmes.

Ce que vous pouvez faire est de rechercher tous les caractères "high-ASCII" car il s'agit soit de caractères ou de symboles accentués LATIN1, soit du premier d'un caractère multi-octets UTF-8. Faire la différence ne sera pas facile à moins de tricher un peu.

Pour déterminer quel encodage est correct, il vous suffit de SELECT deux versions différentes et comparer visuellement. Voici un exemple :

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'), ']')

Ceci est rendu inhabituellement compliqué car le moteur d'expression régulière MySQL semble ignorer des choses comme \x80 et oblige à utiliser le UNHEX() méthode à la place.

Cela produit des résultats comme celui-ci :

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