我将承担将数据库从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。
像时区一样,字符编码一直是问题的根源。
您可以做的是查找任何“高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()方法。
这样会产生如下结果:
Björn Björn来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。