我将承担将数据库从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); 难道这还不够?
SELECT name FROM clients WHERE LENGTH(name) != CHAR_LENGTH(name);
目前,我已将Mysql客户端编码转换为UTF-8。
像时区一样,字符编码一直是问题的根源。
您可以做的是查找任何“高ASCII”字符,因为这些字符可能是LATIN1重音字符或符号,也可能是UTF-8多字节字符的第一个。除非您作弊,否则要说出区别并不容易。
为了弄清楚哪种编码是正确的,您只需使用SELECT两个不同的版本并进行直观比较。这是一个例子:
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()方法。
\x80
UNHEX()
这样会产生如下结果:
latin1 utf8 ---------------------------------------- Björn Björn