MySQL - 查找并修复错误的字符

时间:2016-05-20 14:58:36

标签: mysql utf-8 character-encoding special-characters

我在MySQL中有一个包含人名的表,现在有些人正在使用重音字符。无论此数据库使用何种原始字符集/排序规则,它都无法处理带重音符和字符的字符。诸如'é'之类的字符变为'Ã'',诸如'ü'之类的字符在连接到该数据库的前端应用程序中变成'Ã'。此后数据库已被修改(以及大多数需要它的前端应用程序),因此这些字段使用UTF8编码和排序规则。现在,大多数带有重音的名称都能正确呈现。

问题是,有些字段现在有一个文字'é'(手动复制和粘贴东西引起的一些奇怪的双重编码?我不知道,我不是'那里!)。我现在需要找到所有这些并修改这些字段以使用正确的重音字符。为了找到它们,我写了一个查询(基于我找到的表here):

select count(*), bad_char
from some_table
inner join (
  select '€' as bad_char union
  select '‚' as bad_char union
  select 'Æ’' as bad_char union
  select '„' as bad_char union
  select '…' as bad_char union
  ...
  -- snip a whole bunch
  ...
  select 'þ' as bad_char union
  select 'ÿ' as bad_char ) bad_chars
where some_table.some_text_field like CONCAT('%',bad_chars.bad_char,'%')
group by bad_char
order by count(*);

我得到的结果如下:

count(*), bad_char
------------------
'1',     '¯'
'1',     'Ñ'
'1',     'Ö'
'1',     'Ž'
'1',     'Ç'
'1',     '¬'
...snip...
'1797',  'ß'
'4450',  'Ê'

但我觉得这并不像我认为的那样有效。我正在搜索的“bad_char”组合之一是'Ê'但是当我运行这样的查询时:

select some_text_field from some_table where some_text_field like '%Ê%';

我得到的结果是'as',它们是相同的字母,但没有重音符号。但对于其他情况,例如'¯¯',查询似乎工作正常。

如何才能将此查询提交给而不是将'as'视为与'Ã?'相同?

3 个答案:

答案 0 :(得分:1)

  

我得到的结果很多,因为'这是相同的字母但没有重音。

这将是collation使用的问题 - 这些是用于字符比较的规则集,它们定义了在不同语言中将哪些字符视为相等。

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

答案 1 :(得分:0)

对于Mojibake('é'变成'Ã''),数据的修复

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

你的SELECTs听起来像Mojibake - €应该是,对吗?

代码的修复是理解

  • 客户端中的字节在utf8(正常)中正确编码。
  • 您可能默认与SET NAMES latin1(或set_charset('latin1')或...)相关联。 (应该是utf8。)
  • 表格中的列可能是CHARACTER SET utf8,也可能不是SET NAMES,但应该是这样。

SHOW CREATE TABLE通常由特定于语言的代码完成;你在用什么编程语言。

使用CHARACTER SET查看您正在使用的8.0\t175.0\r\t8.0\t188.5\r\n #^^^^^^^^^^^..^^^^^^^^^^^^ # file1 file2 # tab added by paste

答案 2 :(得分:0)

对于任何试图在latin1字段上修复破坏的UTF8重音文本的人,当其中一些有适当的latin1而其他人已经破坏了UTF8时,解决方案就是这样:

  <package id="log4net" version="2.0.5" targetFramework="net45" />
  <package id="Topshelf" version="4.0.3" targetFramework="net461" />
  <package id="Topshelf.Log4Net" version="4.0.3" targetFramework="net461" />

这会将只有错误编码的UTF8的行恢复为正确的latin1编码,而update posts set post_text = @txt where length(post_text) = length(@txt := convert(binary post_text using utf8)); 将变为á等。