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

标签 mysql utf-8 character-encoding latin1

我即将承担将数据库从 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() 方法。

这会产生如下结果:

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

关于mysql - 如何在 Latin1 编码列中检测 UTF-8 字符 - MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9304485/

相关文章:

c# - 仅使用数字时是否应该设置字符集/代码页?

c# - Microsoft IDE、源文件编码、BOM 和 Unicode 字符\uFEFF?

mysql - 如果存在更新(没有唯一键)如何插入

php - 更新数据时出现禁止错误

php - php 中的 GET/POST 转换为 UTF-8

html - UTF-8 文档浏览器行为中 ¯ 到 ¯ 的规范理由

java - 在 MySQL 5.6 中存储特殊字符

javascript - Nodejs MySQL : Accessing variable in another route

mysql - Rails 中迁移数据库但未找到表?

character-encoding - 更改响应头编码 .Net Core