您当前的位置:首页 > 互联网教程

如何更改Oracle字符集避免乱码

发布时间:2025-05-19 17:24:59    发布人:远客网络

如何更改Oracle字符集避免乱码

一、如何更改Oracle字符集避免乱码

国内最常用的Oracle字符集ZHS16GBK(GBK 16-bit Simplified Chinese)能够支持繁体中文,并且按照2个字符长度存储一个汉字。UTF8字符集是多字节存储,1个汉字(简体、繁体)有时采用3个字符长度存储。Oracle支持字符集的更改,但是UTF8是Oracle中最大的字符集,也就是说UTF8是ZHS16GBK的严格超集。对于子集到超集的转换,Oracle是允许的,但是对于超集到子集的转换是不允许的。一般对于超集到子集的转换,建议是通过dbca删除原来的数据库,重新再建库,选择正确的字符集,然后导入备份。我的方案是:先备份数据,然后强制转换字符集从UTF8到ZHS16GBK,然后导入备份数据。如果不行,才来重新建库,设置字符集ZHS16GBK,导入备份数据。如果这还不行,就把更改字符集从ZHS16GBK到UTF8(这是安全的),再导入备份数据,恢复到原始状况。这样就有可能避开重新建库的麻烦。

1.备份数据库中所有用户的数据以oracle用户登陆,执行以下命令# export NLS_LANG=“SIMPLIFIED CHINESE_CHINA.UTF8”保持与数据库服务器端一致,这样在exp导出时,就不会存在字符的转换了,备份最原始的数据。2.评估UTF8转换成ZHS16GBK的风险转换之前,要使用Oracle的csscan工具对数据库扫描,评估字符集转换前后,数据有可能的损坏情况。如果评估情况糟糕,那就绝对要放弃了。先安装属于 CSMIG用户的一套表和过程。以oracle用户登陆UNIX,#sqlplus“/ as sysdab”SQL>@$ORACLE_HOME/ rdbms/admin/csminst.sqlSQL>exit#$ORACLE_HOME\bin\csscan-help可以更清楚如何使用csscan。#$ORACLE_HOME/bin/csscan system/sunday user=mmsc FROMCHAR=UTF8 TOCHAR=ZHS16GBK ARRAY=102400 PROCESS=3> csscan.log以上命令意思是扫描用户:mmsc中的所有数据,从字符集UTF8更改为ZHS16GBK的转换情况。然后得到三个文件:scan.txt、scan.out、scan.err。查看scan.out,scan.err,可以看出mmsc用户下的所有的数据都是可以转换的,并且没有出现转换“Exceptional”的情况,因此可以更放心一点。3.更改数据库的字符集为ZHS16GBK前面说过,通过命令“Alter Database Characeter Set XXXX”,实现从超集到子集的转换,在Oracle是不允许的。但是该命令,提供这样的命令方式:Alter Database Character Set INTERNAL_CONVERT/ INTERNAL_USE XXXX

这是Oracle的非公开命令。“在使用这个命令时,Oracle会跳过所有子集及超集的检查,在任意字符集之间进行强制转换,所以,使用这个命令时你必须十分小心,你必须清楚这一操作会带来的风险”。以oracle用户登陆UNIX,#sqlplus“/ as sysdba”SQL> SHUTDOWN IMMEDIATE;SQL> STARTUP MOUNT;SQL> ALTER SESSION SET SQL_TRACE=TRUE;SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;SQL> ALTER DATABASE OPEN;SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;//如果不使用“INTERNAL_USE”参数,系统会提示出错://ERROR at line 1://ORA-12712: new character set must be a superset of old character setSQL> ALTER SESSION SET SQL_TRACE=FALSE;SQL> SHUTDOWN IMMEDIATE;SQL> STARTUP;此时,检查一下数据库的字符集是否更改过来SQL> select value$ from props$ where name=’NLS_CHARACTERSET’;VALUE$-----------------ZHS16GBK紧接着检查一下数据库中简体中文、繁体中文是否正常,不会出现乱码。SQL>select spid,spname,spshortname from spinfovisual_hk…...非常不幸,我看到了一堆乱码,这也证明了Oracle不支持字符集从超集到子集的更改,当时心里很紧张,很怕失败,从而恢复到原样。但是根据以前的验证,把UTF8下的备份导入到ZHS16GBK中去,是OK的,所以继续尝试。4.导入备份的用户数据还是以oracle用户登陆UNIX,先删除库中的用户mmsc:#sqlplus“/ as sysdba”SQL>drop user mmsc cascade;SQL>exit再运行createuser.sql,生成mmsc用户。然后使用原来的备份文件,导入到mmsc用户中:注意:先设置NLS_LANG要与当前数据库的一致:ZHS16GBK。这样,导出时用户会话的NLS_LANG为UTF8,与原先的数据库字符集一致;现在为ZHS16GBK,与此时的数据库字符集一致。这样,导入时,就会进行字符转换。# export NLS_LANG=“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”#impmmsc/mmsc@mdspdbfile=DSMPD113_user_mmsc.dmp ignore=y fromuser=mmsc touser=mmsc马上查看数据库中简体、繁体中文,哈哈,没有乱码了,一切显示正常。紧接着进行验证,也证明了:1个汉字此时只占用2个字符长度。问题解决了!

二、如何改oracle AL16UTF16为AL32UTF8

1、SQL>conn/ as sysdba;若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:

2、SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;

3、SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

4、SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;

5、SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;

6、SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;

7、注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能start)按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’这样的提示信息

8、要解决这个问题,用internal_use:

9、SQL>STARTUP MOUNT EXCLUSIVE;

10、SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;

11、SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

12、SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;

13、SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;

14、如果按上面的做法做,National charset的区域设置就没有问题

三、在Oracle数据库中出现中文乱码的情况,怎么解决

1、在Oracle数据库中出现中文乱码的情况,可能是因为以下几个方面:

2、字符集不匹配:Oracle数据库默认使用的字符集为AL32UTF8,如果在创建数据库或者表时没有指定字符集或者指定了其他的字符集,则可能会出现乱码问题。在创建表时,可以使用以下语句指定字符集:

3、数据库连接时没有指定字符集:在连接数据库时,如果没有指定字符集,可能会出现乱码问题。在连接数据库时,可以使用以下语句指定字符集:

4、statement.execute("SET NAMES'utf8'");

5、字段类型不匹配:在创建表时,如果字段类型不匹配,也可能会导致乱码问题。例如,在使用VARCHAR2类型存储中文字符时,需要指定字符长度,如果长度不够,则可能会出现乱码问题。

6、如果出现了中文乱码问题,可以使用以下方法解决:

7、修改字符集:在创建表时,指定正确的字符集;或者在连接数据库时,指定正确的字符集。

8、修改字段类型:如果存储中文字符的字段类型不正确,可以修改字段类型为NVARCHAR2或者NCHAR类型,这两种类型都支持Unicode字符集,可以正确存储中文字符。

9、修改数据:如果出现了中文乱码问题,可以通过修改数据的方式解决。可以使用UPDATE语句更新乱码数据,或者使用INSERT语句重新插入正确的数据。

10、解决中文乱码问题的方法有很多种,需要根据具体情况来选择合适的方法。