sql >> Databasteknik >  >> RDS >> Mysql

Hur man upptäcker UTF-8-tecken i en Latin1-kodad kolumn - MySQL

Teckenkodning, liksom tidszoner, är en ständig källa till problem.

Vad du kan göra är att leta efter alla "hög-ASCII"-tecken eftersom dessa antingen är LATIN1-accenttecken eller symboler, eller det första av ett UTF-8 multi-byte-tecken. Att se skillnaden kommer inte att bli lätt om du inte fuskar lite.

För att ta reda på vilken kodning som är korrekt SELECT två olika versioner och jämföra visuellt. Här är ett exempel:

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

Detta görs ovanligt komplicerat eftersom MySQL regexp-motorn verkar ignorera saker som \x80 och gör det nödvändigt att använda UNHEX() metod istället.

Detta ger resultat som detta:

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


  1. Hur kan jag importera data från ASCII (ISO/IEC 8859-1) till min Rails/PGSQL-databas?

  2. Fulltextsökning sedan PostgreSQL 8.3

  3. JSON-funktioner och -operatörer i SQLite (fullständig lista)

  4. Oracle Database BLOB till InputStream i Java?