开发者社区> 问答> 正文

如何在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。

展开
收起
保持可爱mmm 2020-05-17 21:08:57 1409 0
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来源:stack overflow

    2020-05-17 21:19:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像