一尘不染

如何在Latin1编码的列中检测UTF-8字符-MySQL

mysql

我将承担将数据库从Latin1转换为UTF-8的繁琐而棘手的任务。

在这一点上,我只想检查存储在表中的数据类型,因为这将确定我应使用哪种方法转换数据。

具体来说,我想检查Latin1列中是否有UTF-8字符,什么是最好的方法?如果只影响几行,那么我可以手动修复它。

选项1.执行MySQL转储并使用Perl搜索UTF-8字符吗?

选项2。使用MySQL CHAR_LENGTH查找具有多字节字符的行吗?例如,SELECT name FROM clients WHERE LENGTH(name) != CHAR_LENGTH(name); 难道这还不够?

目前,我已将Mysql客户端编码转换为UTF-8。


阅读 304

收藏
2020-05-17

共1个答案

一尘不染

像时区一样,字符编码一直是问题的根源。

您可以做的是查找任何“高ASCII”字符,因为这些字符可能是LATIN1重音字符或符号,也可能是UTF-8多字节字符的第一个。除非您作弊,否则要说出区别并不容易。

为了弄清楚哪种编码是正确的,您只需使用SELECT两个不同的版本并进行直观比较。这是一个例子:

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

这使得异常复杂,因为MySQL正则表达式引擎似乎忽略了类似的事情\x80,因此有必要使用该UNHEX()方法。

这样会产生如下结果:

latin1                utf8
----------------------------------------
Björn                Björn
2020-05-17