有些数据库中文乱码是因为字符集编码不同导致的,比如gbk字符集用2个byte保存一个中文字符,utf8用3个byte保存一个中文字符。
一些情况下,数据库字符集为ZHS16GBK,但是连接数据库的客户端环境用了UTF8的字符集。
插入中文时,只要在字段长度定义内,应用不会报错,但在其他GBK客户端以及在数据库内看起来,变成了乱码,如果表和记录比较多,要判断哪些记录是这种问题导致的乱码,可以通过字符转换来判断。
通过convert()转换字符集正常显示出中文。

通过以下一个小例子,说明这种问题:
数据库字符集ZHS16GBK
创建一张简单的表:
create table test1 (a varchar2(20));
在gbk的环境下客户端插入一条中文记录:
insert into test1 values('开放系统');
在utf8的环境下客户端插入一条中文记录:
insert into test1 values('这是乱码');

select a,length(a),lengthb(a),convert(a,'ZHS16GBK','UTF8'),length(convert(a,'ZHS16GBK','UTF8')) from test1;

A               LENGTH(A) LENGTHB(A) CONVERT(A,'ZHS16GBK','UTF8')  LENGTH(CONVERT(A,'ZHS16GBK','UTF8'))
-------------- ---------- ---------- ----------------------------- ------------------------------------
杩欐槸涔辩爜            6         12 这是乱码                                                        4
开放系统                4          8 ??????                                                        6

如果是由于UTF8和GBK编码不同导致的乱码,从上面的查询可以判断,如果LENGTH(A) > LENGTH(CONVERT(A,'ZHS16GBK','UTF8')),那么该记录可能就是乱码了。

09-23 14:14