学无止境
分类: Oracle
2014-04-23 15:57:12
有些数据库中文乱码是因为字符集编码不同导致的,比如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')),那么该记录可能就是乱码了。