我即将承担将数据库从 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)