扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
转载自寒思国内最常用的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.sql
SQLexit
#
$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
set
SQL
ALTER
SESSION
SET
SQL_TRACE=FALSE;
SQL
SHUTDOWN
IMMEDIATE;
SQL
STARTUP;
此时,检查一下数据库的字符集是否更改过来
SQL
select
value$
from
props$
where
name=’NLS_CHARACTERSET’;
VALUE$
-----------------
ZHS16GBK
紧接着检查一下数据库中简体中文、繁体中文是否正常,不会出现乱码。
SQLselect
spid,spname,spshortname
from
spinfovisual_hk
…...
非常不幸,我看到了一堆乱码,这也证明了Oracle不支持字符集从超集到子集的更改,当时心里很紧张,很怕失败,从而恢复到原样。
但是根据以前的验证,把UTF8下的备份导入到ZHS16GBK中去,是OK的,所以继续尝试。
4.
导入备份的用户数据
还是以oracle用户登陆UNIX,
先删除库中的用户mmsc:
#sqlplus
“/
as
sysdba”
SQLdrop
user
mmsc
cascade;
SQLexit
再运行createuser.sql,生成mmsc用户。
然后使用原来的备份文件,导入到mmsc用户中:
注意:先设置NLS_LANG要与当前数据库的一致:ZHS16GBK。这样,导出时用户会话的NLS_LANG为UTF8,与原先的数据库字符集一致;现在为ZHS16GBK,与此时的数据库字符集一致。这样,导入时,就会进行字符转换。
#
export
NLS_LANG
=
“SIMPLIFIED
CHINESE_CHINA.ZHS16GBK”
#imp
mmsc/mmsc@mdspdb
file=DSMPD113_user_mmsc.dmp
ignore=y
fromuser=mmsc
touser=mmsc
马上查看数据库中简体、繁体中文,哈哈,没有乱码了,一切显示正常。
紧接着进行验证,也证明了:1个汉字此时只占用2个字符长度。问题解决了!
1、改客户端字符集:通过WINDOWS的运行菜单运行Regedit,修改注册表
Start - Run - Rededit -|
Under registry Editor - HKEY_LOCAL_MACHINE - SOFTWARE -ORACLE-KEY_XE-RIGHT WINDOW DOUBLE CLICK NLS_LANG - CHANGE VALUE TO "AMERICAN_AMERICA.UTF8" -OK -CLOSE REGISTRY
正确设置ORACLE客户端字符集的方法:
oracle客户端字符集设置需要和服务器端一致,否则会出现乱码问题。
首先连接服务器,查询服务器端设置:
select * from v$nls_parameters;
找到:
NLS_LANGUAGE
NLS_TERRITORY
NLS_CHARACTERSET
环境变量nls_lang便是由这三部分组成
NLS_LANG = language_territory.charset
比如:
NLS_LANG = American_Japan.JA16SJIS
2、改服务器端字符集,通过ORACLE的SQL PLUS命令窗口改
在SQL*PLUS 中,以DBA登录
conn 用户名 as sysdba
然后执行以下命令
shutdown immediate; (把database停了)
startup mount; (把database重开去可更改情况)
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
alter database open;
alter database character set utf8;
OR
alter database character set internal_use utf8;
shutdown immediate;
startup; (重开正常oracle)
ORACLE数据库字符集修改完成!
A、oracle server 端字符集查询
select userenv('language') from dual
其中NLS_CHARACTERSET 为server端字符集
NLS_LANGUAGE 为 server端字符显示形式
B、查询oracle client端的字符集
$echo $NLS_LANG
如果发现你select 出来的数据是乱码,请把client端的字符集配置成与linux操作系统相同的字符集。如果还是有乱码,则有可能是数据库中的数据存在问题,或者是oracle服务端的配置存在问题。
C、server端字符集修改
将数据库启动到RESTRICTED模式下做字符集更改:
SQL conn /as sysdba Connected.
SQL shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
如果发现你select 出来的数据是乱码,请把client端的字符集配置成与linux操作系统相同的字符集。如果还是有乱码,则有可能是数据库中的数据存在问题,或者是oracle服务端的配置存在问题。
. 1.oracle server端字符集查询 复制代码代码如下: select userenv('language') from dual; server字符集修改: 将数据库启动到RESTRICTED模式下做字符集更改:??
oracle10g服务器端是安装在AIX 6.0系统上,客户端是安装在windows server 2008 系统上,客户端与服务器已成功连接,但是数据库表里的中文字无法显示,显示为“?”,用SQLPLUS查得服务器端的字符集为AL16uTF16,如何修改该字符集使之支持中文呢?另外oracle10G客户端的字符集需不需要设置,如何查看和设置呢?
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流