乱码一般都是正常编码被错误的解析而导致。每个错误的编码,都会对应着一个正确的编码,也就是,出现频率高的乱码字符,其实就是出现高频字符(一般都是汉字)对应的乱码。
所以说,如果找到高频字符对应的乱码,在sql表里,使用like 查询即可以找到乱码行。
也就是说,查找到一系列高频乱码字符,就可以很容易的查找到绝大多数乱码行。
由于有乱码的表里存储的数据可能是不同行业、不同领域的信息,高频汉字可能不尽相同。(生命科学领域里,细、胞、蛋、白、质、核、酸等这些字频率会非常高;而计算机领域里,内、存、储、变、量、进、程等汉字会是调频汉字;其它领域亦类似)。
所以查找剔除乱码记录时,最好是整理一个最准确乱码字符表。
下面给出一个整理乱码表比较直接、有效的方法(是笔者所探索发现的方法):
1. 找到一定数量的乱码记录(建议在200条以上)
2. 把这些乱码整理出来,并拆分成单字,并统计每个单字出现频率。(建议使用excel+UE/editplus等工具)
3. 取最高频的50个单字(这里当然是要找明显是乱码的单字;也可以不是50个字,80个100个也行)
4. 使用UE或excel生成对应的50个sql like语句,形式如下
select * from [乱码表] where [乱码字段] like ‘%锛%’
select * from [乱码表] where [乱码字段] like ‘%绂%’
select * from [乱码表] where [乱码字段] like ‘%脠%’
select * from [乱码表] where [乱码字段] like ‘%┖%’
select * from [乱码表] where [乱码字段] like ‘%锲%’
……
为了查询方便,最把生成一个union语句,如下
select * from [乱码表] where [乱码字段] like ‘%悎%’ union
select * from [乱码表] where [乱码字段] like ‘%灏%’ union
select * from [乱码表] where [乱码字段] like ‘%楁%’ union
select * from [乱码表] where [乱码字段] like ‘%闀%’ union
select * from [乱码表] where [乱码字段] like ‘%寰%’ union
select * from [乱码表] where [乱码字段] like ‘%阍%’ union
…..
5. 使用上步生成的sql语句查询,查询到结果基本上全部都是乱码行(把乱码记录复制下来,下一步有用),把这些行的主键ID号复制粘贴到ue/editplus,整理成一个逗号拼接形式,就可以使用一个in语句删除
delete from [乱码表] where [主键id] in(num1,num2,num3,…)
[如果上步语句查询结果里有非乱码行,则明记下非乱码行的ID号,在生成delete … in … 语句时,剔除这些ID号,就可保证万无一失]
6. 如果需要更进一步删除乱码,可对上一步记下的乱码记录做以下步骤:
单字分隔-统计词频-取法高频乱码单字-整理sql like语句-查询-确认-生成delete… in…语句-删除
这一过程可以继续多次进行,直至没有乱码行为止。
[注]
1. “乱码”只是习惯说法。乱码单字其实也都是正常的字符——多半是比较生僻的汉字,类似于时下流行已久的“火星文”。其中当然也有一些常见的汉字。
2. 上面提到清理乱码方法是提到的”200条乱码记录”、”50个乱码单字”是笔者操作中使用,你也可以增减这些数目,以达到最佳的清理效果。