sql >> Database >  >> RDS >> Mysql

UTF-8-tekens detecteren in een Latin1-gecodeerde kolom - MySQL

Tekencodering is, net als tijdzones, een constante bron van problemen.

Wat u kunt doen, is zoeken naar "high-ASCII"-tekens, aangezien dit ofwel LATIN1-tekens of symbolen met accenten zijn, of de eerste van een UTF-8 multi-byte-teken. Het verschil vertellen zal niet gemakkelijk zijn, tenzij je een beetje vals speelt.

Om erachter te komen welke codering correct is, moet je gewoon SELECT twee verschillende versies en vergelijk visueel. Hier is een voorbeeld:

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

Dit wordt ongewoon ingewikkeld gemaakt omdat de MySQL regexp-engine dingen als \x80 lijkt te negeren en maakt het nodig om de UNHEX() . te gebruiken methode in plaats daarvan.

Dit levert de volgende resultaten op:

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


  1. FOUT:relatie plaatsen bestaat niet Heroku db import

  2. Zoek gebroken objecten in SQL Server

  3. Doe while-lus in SQL Server 2008

  4. JSON_VALID() – Test voor geldige JSON in MySQL