MySQL-查找并修复不正确的字符

MySQL-查找并修复不正确的字符,mysql,utf-8,character-encoding,special-characters,Mysql,Utf 8,Character Encoding,Special Characters,我在MySQL中有一个包含人名的表,现在有些人输入带有重音的字符。无论此数据库使用何种原始字符集/排序规则,它都无法处理带有重音符号和字符的字符。在连接到此数据库的前端应用程序中,诸如“é”之类的字符变为“Ô),诸如“ü”之类的字符变为“ü”。此后,数据库以及大多数需要它的前端应用程序都进行了修改,以便这些字段使用UTF8编码和排序规则。大多数带有重音符号的名称现在可以正确渲染 问题是,有些字段现在有一个文字“Ô)一些奇怪的双重编码是由手动复制和粘贴内容引起的?我不知道,我不在那儿!。我现

我在MySQL中有一个包含人名的表,现在有些人输入带有重音的字符。无论此数据库使用何种原始字符集/排序规则,它都无法处理带有重音符号和字符的字符。在连接到此数据库的前端应用程序中,诸如“é”之类的字符变为“Ô),诸如“ü”之类的字符变为“ü”。此后,数据库以及大多数需要它的前端应用程序都进行了修改,以便这些字段使用UTF8编码和排序规则。大多数带有重音符号的名称现在可以正确渲染

问题是,有些字段现在有一个文字“Ô)一些奇怪的双重编码是由手动复制和粘贴内容引起的?我不知道,我不在那儿!。我现在需要找到所有这些字段,并修改这些字段以使用正确的重音字符。为了找到它们,我根据找到的表编写了一个查询:

我得到的结果如下:

count(*), bad_char ------------------ '1', '¯' '1', 'Ñ' '1', 'Ö' '1', 'Ž' '1', 'Ç' '1', '¬' ...snip... '1797', 'ß' '4450', 'Ê'
select some_text_field from some_table where some_text_field like '%Ê%';
我得到的许多结果都是“as”,它们是相同的字母,但没有重音。但对于其他情况,如“查询”,查询似乎可以正常工作

我怎样才能使这个查询不把“as”和“Ê”一样对待

我得到的许多结果都是“as”,它们是相同的字母,但没有重音

这将是一个使用的问题——这些是字符比较的规则集,它们定义了在不同语言中哪些字符是平等的


但是您可以使用直接在查询中更改它。

对于Mojibake'e'变成'é的情况,数据的修复是

你的选择听起来像是莫吉贝克——应该是,对吗

代码的修复方法是理解这一点

客户端中的字节以utf8格式正确编码。 默认情况下,您可能使用集合名latin1或SET_charset'latin1'或。它应该是utf8。 表中的列可能是字符集utf8,也可能不是字符集utf8,但它应该是字符集utf8。 集合名称通常由特定于语言的代码完成;你用的是什么编程语言


使用SHOW CREATE TABLE查看您使用的字符集。

对于试图修复拉丁文1字段上的UTF8重音文本的任何其他人,当其中一些字段具有正确的拉丁文1,而另一些字段具有UTF8重音时,解决方案如下:

update posts set post_text = @txt where length(post_text) = length(@txt := convert(binary post_text using utf8));

这只会将那些UTF8编码错误的行修复回正确的拉丁1编码,并且“将变成”等。

根据数据库的大小,我可能会转储内容,在文本编辑器中替换生成的SQL文件中的字符,然后再次上传…@CBroe:可能太大了。我真的更愿意把这类东西保存在数据库中,而不是编写一大堆脚本来提取到文件、转换和重新加载。那么,这些脚本已经存在了——phpmyadmin,或者如果你想让它更小,adminer这是一个漂亮的单文件数据库管理界面。请提供选择列,来自。。。所以我们可以看到存储了什么。加上提供显示创建表。根据这些信息,我们可以确定您是否使用双重编码和/或您的数据在尝试修复后是否损坏到无法修复。
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;
update posts set post_text = @txt where length(post_text) = length(@txt := convert(binary post_text using utf8));