我即将承担将数据库从 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/