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

MySQL - find and fix incorrect characters

我在 MySQL 中有一个包含人名的 table,现在有些人正在输入带有重音符号的字符。无论本数据库使用什么原始字符set/collation,它都无法处理带有重音符号和字符的字符。在连接到该数据库的前端应用程序中,'é'等字符变成了'É','ü'等字符变成了'ü'。数据库已被修改(以及大多数需要它的前端应用程序),以便这些字段使用 UTF8 编码和排序规则。大多数带有重音符号的名字现在可以正确呈现。

问题是,有些字段现在有 文字 'É'(手动复制和粘贴内容导致的一些奇怪的双重编码?我不知道知道,我不在那里!)。我现在需要找到所有这些并修改这些字段以使用正确的重音字符。为了找到它们,我写了一个查询(基于我找到的 table 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'和'É'一样对待?

I get many results that are 'as' which are the same letters but without the accents.

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

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

对于 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

对于任何其他试图修复 latin1 字段上损坏的 UTF8 重音文本的人,当其中一些具有正确的 latin1 而其他人具有损坏的 UTF8 时,解决方案是:

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

这只会将那些错误编码的 UTF8 行修复为正确的 latin1 编码,并且 á 将变为 á,等等