我在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'视为与'Ã?'相同?
答案 0 :(得分:1)
我得到的结果很多,因为'这是相同的字母但没有重音。
这将是collation使用的问题 - 这些是用于字符比较的规则集,它们定义了在不同语言中将哪些字符视为相等。
但您可以使用BINARY
operator直接在查询中更改它。
答案 1 :(得分:0)
对于Mojibake('é'变成'Ã''),数据的修复是
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;
你的SELECTs
听起来像Mojibake - €
应该是€
,对吗?
代码的修复是理解
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));
将变为á
等。