Oracle字符集乱码问题解决方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle汉字乱码问题原因及解决方法

目录

问题现象 (1)

问题原因 (1)

解决办法 (3)

问题现象

在开发项目中一直使用的是PostgreSQL,安装方便使用与oracle类似,但是由于性能相比较Oracle还是会差不少,所以一些数据量比较大的项目还是会用到Oracle数据库,但是在安装数据库以后发现中文数据在数据库中会产生乱码,使用PlSql查询依然也是乱码。如下图所示:

问题原因

Oracle中出现中文乱码的主要原因是字符集不同。Oracle中对于字符集来说我们关心三个地方的字符集:

● Oracle服务器内部的字符集

● NLS_LANG变量里保存的字符集

● 客户端应用的字符集

Oracle服务器内部的字符集

Oracle服务器内部的字符集是Oracle数据库存储数据使用的字符集,可以使用如下的查询语句查询

Select userenv('language') from dual;

或者:

Select name, value$ from props$;

NLS_LANG变量里保存的字符集

NLS_LANG这个是Oracle设置的一个变量,在Windows中,这个变量保存在注册表中:

HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0保存着NLS_LANG变量。

在Unix/Linux中,则需要自己进行设置了。可以在.profile里面加上

NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

export NLS_LANG

客户端应用的字符集

Oracle客户端使用比较多的是PLSQL Developer 当然目前plsql客户端还不能很好的支持64为的Oracle 当然可以下载Oracle官方的客户端再通过关联可以使用plsql连接上64位的Oracle数据库,这与本文主题略有偏离便不详细描述了。

如果 Oracle服务器内部的字符集和 NLS_LANG变量里保存的字符集相同,在进行Oracle查询时,就会将Oracle中的数据直接查出来,返回给查询用户。进行Oracle的插入操作,就会直接将插入的数据保存进数据库中。

但是如果不同的话,Oracle查询时,会根据这两个字符集的一个映射,将数据库中的数据作一个转换,再返回给查询用户。进行插入操作时,也会根据映射,将插入的数据作一个转换,再插入数据库。这也是产生乱码的原因,这一层转换,把数据都给转乱了。

解决办法

通过上述分析,我们只需要将数据库的字符集和NLS_LANG字符集设置的一样,就可以避免乱码的出现了,当然在Oracle中支持中文需要将数据库字符集修改成:ZHS16GBK即可。

修改数据库字符集的步骤如下:

1、拥有修改权限(用管理用户登录)。

SQL>conn sys/sys as sysdba;

2、关闭数据库。

SQL>shutdown immediate;

3、启动数据库到Mount状态下。

SQL>STARTUP MOUNT;

ORACLE instance started.

Total System Global Area 76619308 bytes

Fixed Size 454188 bytes

Variable Size 58720256 bytes

Database Buffers 16777216 bytes

Redo Buffers 667648 bytes

Database mounted.

SQL>ALTER SESSION SET SQL_TRACE=TRUE;

Session altered.

SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;

System altered.

SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

System altered.

SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;

System altered.

4、启动数据库

SQL>Alter database open;

5、修改字符集

SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;

注:(如果修改失败,则可能是如下原因引起的)

1. 如果数据库表中有CLOB类型的列,是不允许修改字符集的,解决方法为,

先导出这个表的内容,然后删除这个表,修改完后,再导入这个表的内容就可以了。

2. 旧的字符集必须是新的字符集的子集,否则不能修改。

修改完后,可以查看一下修改是否成功。

6、关闭数据库

SQL>Shutdown immediate;

7、重新启动数据库

SQL>startup;

经过设置完Oracle字符集后,一般的乱码问题应该解决掉了。

相关文档
最新文档