din*_*nie 16 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.
tad*_*man 48
与时区一样,字符编码是问题的常见来源.
您可以做的是查找任何"高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'), ']')
Run Code Online (Sandbox Code Playgroud)
这使得异常复杂,因为MySQL regexp引擎似乎忽略了类似的东西\x80
,并且有必要使用该UNHEX()
方法.
这会产生如下结果:
latin1 utf8
----------------------------------------
Björn Björn
Run Code Online (Sandbox Code Playgroud)
由于你的问题不完全清楚,我们假设一些场景:
?
.