Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1143898
  • 博文数量: 231
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 2662
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-03 16:35
个人简介

学无止境

文章分类

全部博文(231)

文章存档

2014年(7)

2013年(103)

2011年(11)

2010年(53)

2009年(57)

分类: 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')),那么该记录可能就是乱码了。

阅读(5563) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~