oracle注册表字符串,oracle中字符集的相关问题

oracle数据库的字符集始终是一个比较烦人的问题,每个人所遇到的问题也不同,不过大的方向基本相同,深入了解字符集问题有助于我们更好地学习和使用oracle数据库和在oracle平台上进行相关的开发。[@more@]

导出/导入与字符集

明白ORACLE多国语言设置,ORACLE多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示、货币形式、排序方式和CHAR,VARCHAR2,CLOB,LONG字段的数据的存储/显示等有效。ORACLE多国语言设置最主要的两个特性就是国家语言设置与字符集设置。国家语言设置决定了界面或提示使用的语言种类;字符集决定了数据库保存与字符集有关数据(如文本)的编码规则。正如上面的一个小例子,环境变量NLS_LANG的不同,导致EXP帮助发生变化,这就是多国语言设置的作用(NLS_LANG包含国家语言设置与字符集设置,这里起作用的是国家语言设置,而不是字符集)。

ORACLE字符集设定,分为数据库字符集和客户端字符集环境设置。在数据库端,字符集在创建数据库的时候设定,并保存在数据库props$表中,对于8i以上产品,已经可以采用“Alter database character set 字符集”来修改数据库的字符集,但也仅仅是从子集到超集。不要通过update props$来修改字符集,如果是不支持的转换,可能会失去所有与字符集有关的数据,就是支持的转换,也可能导致数据库的不正常工作。字符集分为单字节字符集与多字节字符集,US7ASCII就是典型的单字节字符集,在这种字符集中length=lengthb,而ZHS16GBK就是常用的双字节字符集,在这里lengthb=2*length。

客户端的字符集环境比较简单,主要是环境变量或注册表项NLS_LANG,注意NLS_LANG的优先级别为:参数文件à注册表à环境变量àalter sessionà函数。NLS_LANG的组成为“国家语言设置.字符集”,如nls_lang=simplified chinese_china.zhs16gbk。客户端的字符集最好与数据库端一样(国家语言设置可以不一样,如zhs16gbk的字符集,客户端可以是nls_lang =simplified chinese_china.zhs16gbk或Ameircan_America.zhs16gbk,都不影响数据库字符的正常显示),如果字符集不一样,而且字符集的转换也不兼容,那么客户端的数据存储/显示和导出/导入的与字符集有关的数据将都是乱码。

使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里需要一个2进制文件编辑工具即可,如uedit32。用编辑方式打开导出的dmp文件,获取2、3字节的内容,如00 01,先把它转换为10进制数,为1,使用函数NLS_CHARSET_NAME即可获得该字符集:

SQL> select nls_charset_name(1) from dual;

NLS_CHARSET_NAME(1)

-------------------

US7ASCII

可以知道该dmp文件的字符集为US7ASCII,如果需要把该dmp文件的字符集换成ZHS16GBK,则需要用NLS_CHARSET_ID获取该字符集的编号:

SQL> select nls_charset_id('zhs16gbk') from dual;

NLS_CHARSET_ID('ZHS16GBK')

--------------------------

852

把852转换成16进制数,为354,把2、3字节的00 01换成03 54,即完成了把该dmp文件字符集从us7ascii到zhs16gbk的转化,这样,再把该dmp文件导入到zhs16gbk字符集的数据库就可以了。(注意,十进制与十六进制之间的转换,想明白其中的道理)

怎么样查看数据库字符集

[A]数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。

客户端字符集环境select * from nls_instance_parameter,其来源于v$parameter,

表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表

会话字符集环境 select * from nls_session_parameter,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameter一致。

客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件

字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。

1.查询服务器端配置的字符集。在sqlplus中以dba用户执行:

select tab1.aa||'_'||tab2.bb||'.'||tab3.cc from (select VALUE$ aa from sys.props$ where name='NLS_LANGUAGE')tab1,(select VALUE$ bb from sys.props$ where name='NLS_ISO_CURRENCY')tab2,(select VALUE$ cc from sys.props$ where name='NLS_CHARACTERSET')tab3;

2.在客户端的注册表HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0中,如无系统变量NLS_LANG,则“新建”->“字符串”,重命名为“NLS_LANG”,并赋值为上述查询变量的值(注意引号内的字符应大写),再查看时不需要重启Oracle。

1、检查服务器上Oracle数据库的字符集

SQL> conn sys/change_on_install

连接成功.

SQL> desc props$

列名 可空值否 类型

------------------------------- -------- ----

NAME NOT NULL VARCHAR2(30)

VALUE$ VARCHAR2(2000)

COMMENT$ VARCHAR2(2000)

SQL> col value$ format a40

SQL> select name,value$ from props$;

NAME VALUE$

------------------------------ -------------------------

DICT.BASE 2

NLS_LANGUAGE AMERICAN

NLS_TERRITORY AMERICA

NLS_CURRENCY $

NLS_ISO_CURRENCY AMERICA

NLS_NUMERIC_CHARACTERS .,

NLS_DATE_FORMAT DD-MON-YY

NLS_DATE_LANGUAGE AMERICAN

NLS_CHARACTERSET ZHS16GBK

NLS_SORT BINARY

NLS_CALENDAR GREGORIAN

NLS_RDBMS_VERSION 7.3.4.0.0

GLOBAL_DB_NAME ORACLE.WORLD

EXPORT_VIEWS_VERSION 3

NLS_CHARACTERSET和NLS_CHAR_CTERSET这个参数应该是ZHS16GBK,如不是,改为它。

SQL*Plus中修改方法:

SQL> update props$ set value$='新字符集' where name='NLS_CHARACTERSET';

solaris8、oracle8.1.7

环境:

ORACLE_SID=ora8i

ORACLE_BASE=$HOME

ORACLE_HOME=$ORACLE_BASE/products/8.1.7

NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

LD_LIBRARY_PATH=/usr/lib:/usr/dt/lib:/usr/openwin/lib:$ORACLE_HOME/lib

PATH=$PATH:/usr/dt/bin:/usr/openwin/bin:$ORACLE_HOME/bin

export ORACLE_BASE ORACLE_HOME ORACLE_SID NLS_LANG LD_LIBRARY_PATH PATH

v$nls_parameters的内容:

'PARAMETER','VALUE'

'NLS_LANGUAGE','SIMPLIFIED CHINESE'

'NLS_TERRITORY','CHINA'

'NLS_CURRENCY','RMB'

'NLS_ISO_CURRENCY','CHINA'

'NLS_NUMERIC_CHARACTERS','.,'

'NLS_CALENDAR','GREGORIAN'

'NLS_DATE_FORMAT','DD-MON-RR'

'NLS_DATE_LANGUAGE','SIMPLIFIED CHINESE'

'NLS_CHARACTERSET','US7ASCII'

'NLS_SORT','BINARY'

'NLS_TIME_FORMAT','HH.MI.SSXFF AM'

'NLS_TIMESTAMP_FORMAT','DD-MON-RR HH.MI.SSXFF AM'

'NLS_TIME_TZ_FORMAT','HH.MI.SSXFF AM TZH:TZM'

'NLS_TIMESTAMP_TZ_FORMAT','DD-MON-RR HH.MI.SSXFF AM TZH:TZM'

'NLS_DUAL_CURRENCY','RMB'

'NLS_NCHAR_CHARACTERSET','US7ASCII'

'NLS_COMP','BINARY'

字符集是US7ASCII,怎样设置为ZHS16GBK(是否这样写)呢?

请大家帮帮忙吧,多谢了

---------------------------------------------------------------

c:>svrmgrl

在svrmgrl中执行:

shutdown

startup mount

ALTER SYSTEM ENABLE RESTRICTED SESSION;

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

ALTER SYSTEM SET AQ_TM_PROCESSES=0;

ALTER DATABASE OPEN;

update props$ set value$='ZHS16GB' WHERE NAME='NLS_CHARACTERSET';

update props$ set value$='ZHS16GB' WHERE NAME='NLS_NCHAR_CHARACTERSET';

先申明此法很危险,

如果改错了值可能会导致数据库无法打开。

×××××××××××××

修改字符集的步骤:

c:>svrmgrl

在svrmgrl中执行:

connect internal/oracle[@dbname];

shutdown immediate;

startup restrict;

ALTER DATABAE [dbname] CHARACTER SET [SIMPLIFIED CHINESE_CHINA.]ZHS16GBK ;

ALTER DATABAE [dbname] NATIONAL CHARACTER SET [SIMPLIFIED CHINESE_CHINA.]ZHS16GBK ;

alter database [dbname] open;

--shutdown immediate;

--startup;

怎么样查看数据库字符集

[A]数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。

客户端字符集环境select * from nls_instance_parameter,其来源于v$parameter,

表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表

会话字符集环境 select * from nls_session_parameter,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameter一致。

客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件

字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值