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 的问题 - 这些是用于字符比较的规则集,它们定义了哪些字符在不同语言中被视为相同。
但您可以使用 BINARY
operator 直接在查询中更改它。
对于 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 编码,并且 á
将变为 á
,等等
我在 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 的问题 - 这些是用于字符比较的规则集,它们定义了哪些字符在不同语言中被视为相同。
但您可以使用 BINARY
operator 直接在查询中更改它。
对于 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 编码,并且 á
将变为 á
,等等