更改Oracle实例的字符集

简介: (1).数据库服务器字符集select * from nls_database_parameters 来源于props$,是表示数据库的字符集。 (2).服务端字符集环境select * from nls_instance_parameters 其来源于v$parameter,表示服务端的字符集的设置,可能是参数文件,环境变量或者是注册表 (3).

(1).数据库服务器字符集
select * from nls_database_parameters

来源于props$,是表示数据库的字符集。

(2).服务端字符集环境
select * from nls_instance_parameters

其来源于v$parameter,表示服务端的字符集的设置,可能是参数文件,环境变量或者是注册表

(3).会话字符集环境
select * from nls_session_parameters

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

 (4).客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。

如果多个设置存在的时候,NLS作用优先级别:Sql function > alter session > 环境变量或注册表 > 参数文件 > 数据库默认参数

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

客户端字符集设置方法
1)UNIX环境
         $NLS_LANG=“simplified chinese”_china.zhs16gbk
         $export NLS_LANG
         
编辑oracle用户的profile文件
2)Windows环境
编辑注册表
Regedit.exe --- HKEY_LOCAL_MACHINE ---SOFTWARE --- ORACLE-HOME
或者在窗口设置:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
http://blog.itpub.net/8475224/viewspace-692675/

NLS_LANG格式:
NLS_LANG = language_territory.charset
有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:
language 指定服务器消息的语言。
territory 指定服务器的日期和数字格式。
charset 指定字符集
从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。
所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。

字符集
实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。
Oracle的字符集命名遵循以下命名规则:
即: <语言><比特位数><编码>
比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集
http://blog.itpub.net/8475224/viewspace-692675/

例如:
AMERICAN_AMERICA.US7SCII
AMERICAN _ AMERICA. ZHS16GBK
只显示了语言信息,是因为数据库安装时默认使用OS的地域和字符集。
安装Oracle的时候不是有个显示字符集选择的步骤吗,那个时候安装程序自己就带出了一个OS的字符集作为默认选择,当然你可以更改的。
select * from nls_session_parameters;
更改Oracle实例的字符集(服务器端):

--SIMPLIFIED CHINESE_CHINA.ZHS16GBK
--=<Language>_<Territory>.<Clients Characterset>
select t.name,t.value$,t.rowid from sys.props$  t where name='NLS_LANGUAGE' or name='NLS_CHARACTERSET' or name like 'NLS_TERRITORY';

具体更改情况参考以下update语句:

update sys.props$ set value$='SIMPLIFIED CHINESE'  where name='NLS_LANGUAGE';
commit;
update sys.props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET' ;
commit;
update sys.props$ set value$='CHINA'  where name='NLS_TERRITORY';
commit;

如果更改后没有立即生效,重启此实例。

 

查看服务器端字符集:
select * from v$nls_parameters;
select * from nls_database_parameters;
select * from sys.props$;

 


http://www.linuxidc.com/Linux/2010-03/24767.htm

 

在做ETL的时候,经常有一些字段提示长度不够。今天偶抓住一张表来分析了一下,后来发现中文在不同字符集所占用的字节是不同的。详细如下:

源数据库字符集为: ZHS16GBK,数据仓库的字符集为:UTF-8

查询字符集:
SELECT * FROM DATABASE_PROPERTIES WHERE property_name = 'NLS_CHARACTERSET'

源数据库:(ZHS16GBK)

SQL> SELECT '中文', length('中文') x, lengthb('中文') xb FROM dual;
'中文'          X         XB
------ ---------- ----------
中文            2          4

目标数据库:(UTF8)

SQL> SELECT '中文', length('中文') x, lengthb('中文') xb FROM dual;
'中文'                X         XB
------------ ---------- ----------
中文                  2          6

 

做了一个表测试了一下:

在源数据库里:

SQL> create table cntable(fname varchar2(4));
Table created
SQL> insert into cntable(fname) values('张三');
1 row inserted

在目标数据仓库里:

SQL> create table cntable(fname varchar2(4));
Table created
SQL> insert into cntable(fname) values('张三');
insert into cntable(fname) values('张三')
ORA-12899: value too large for column "HUB"."CNTABLE"."FNAME" (actual: 6, maximum: 4)

 

很显然中文在UTF8里占3个字节,ZHK里占2个字节。

备注:

Purpose

The LENGTH functionsreturn the length of char. LENGTH calculates length usingcharacters as defined by the input character set.

     --返回以字符为单位的长度.

LENGTHB usesbytes instead of characters.

     --返回以字节为单位的长度.

LENGTHC usesUnicode complete characters.

     --返回以Unicode完全字符为单位的长度.

LENGTH2 usesUCS2 code points.

     --返回以UCS2代码点为单位的长度.

LENGTH4 usesUCS4 code points.

    --返回以UCS4代码点为单位的长度.

在不同的数据库,因为字符集的不同,LENGTHB得到的值可能会不一样。如ZHS16GBK采用两个byte位来定义一个汉字。而在UTF8,采用3个byte。

SYS@anqing1(rac1)> SELECT USERENV('LANGUAGE') FROM DUAL;

USERENV('LANGUAGE')

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

AMERICAN_AMERICA.ZHS16GBK

SQL>select length('安庆') from dual;

2

SQL>select lengthb('安庆') from dual;

4

SQL>select length('AnQing') from dual;

6

SQL>select lengthb('AnQing') from dual;

6

通过这个示例,我们可以看出来,Length 和 Lengthb 函数的一个重要用处,就是用来判断记录值里是否有中文内容。

如果有中文,那么Length() != Lengthb()

如果没有中文,那么Length() == Lengthb()

http://blog.csdn.net/tianlesoftware/article/details/6863797

 

USEREVN -- 官方文档 functions228.htm#i79862
Oracle建议用 sys_context 来代替 userenv

USERENV('DB_NAME')  《--------》SYS_CONTEXT('USERENV','DB_NAME');

返回当前用户环境<也就是sqlplus 所在电脑的环境>的信息,opt可以是:
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE

USEREVN()

1.ISDBA 查看当前用户是否是DBA如果是则返回true

SQL> select userenv('isdba') from dual;

USEREN
------
FALSE


2.SESSION 返回会话标志


SQL> select userenv('sessionid') from dual;

USERENV('SESSIONID')
--------------------
152


4.ENTRYID 返回会话人口标志


SQL> select userenv('entryid') from dual;

USERENV('ENTRYID')
------------------
0


5.INSTANCE 返回当前INSTANCE的标志
SQL> select userenv('instance') from dual;

USERENV('INSTANCE')
-------------------
1


6.LANGUAGE 返回当前环境变量
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK

7.LANG 返回当前环境的语言的缩写
SQL> select userenv('lang') from dual;

USERENV('LANG')
----------------------------------------------------
ZHS


8.TERMINAL 返回用户的终端或机器的标志
SQL> select userenv('terminal') from dual;

USERENV('TERMINA
----------------
GAO


9.VSIZE(X) 返回X的大小(字节)数
SQL> select vsize(user),user from dual;

VSIZE(USER) USER
----------- ------------------------------
6 SYSTEM

select   SYS_CONTEXT('USERENV', 'DB_NAME') db_name,
         SYS_CONTEXT('USERENV', 'CURRENT_USER') current_user,
         SYS_CONTEXT('USERENV', 'LANGUAGE') language,
       
         SYS_CONTEXT('USERENV', 'OS_USER') os_user,
         SYS_CONTEXT('USERENV', 'TERMINAL') terminal,
         SYS_CONTEXT('USERENV', 'SESSIONID') sessionid,
         SYS_CONTEXT('USERENV', 'INSTANCE') instance,
         SYS_CONTEXT('USERENV', 'ENTRYID') entryid,
         SYS_CONTEXT('USERENV', 'ISDBA') isdba,
         SYS_CONTEXT('USERENV', 'NLS_TERRITORY') nls_territory,
         SYS_CONTEXT('USERENV', 'NLS_CURRENCY') nls_currency,
         SYS_CONTEXT('USERENV', 'NLS_CALENDAR') nls_calendar,
         SYS_CONTEXT('USERENV', 'NLS_DATE_FORMAT') nls_date_format,
         SYS_CONTEXT('USERENV', 'NLS_DATE_LANGUAGE') nls_date_language,
         SYS_CONTEXT('USERENV', 'NLS_SORT') nls_sort,
       
         SYS_CONTEXT('USERENV', 'CURRENT_USERID') current_userid,
         SYS_CONTEXT('USERENV', 'SESSION_USER') session_user,
         SYS_CONTEXT('USERENV', 'SESSION_USERID') session_userid,
         SYS_CONTEXT('USERENV', 'PROXY_USER') proxy_user,
         SYS_CONTEXT('USERENV', 'PROXY_USERID') proxy_userid,
         SYS_CONTEXT('USERENV', 'DB_DOMAIN') db_domain,
         SYS_CONTEXT('USERENV', 'HOST') host,
         SYS_CONTEXT('USERENV', 'EXTERNAL_NAME') external_name,
         SYS_CONTEXT('USERENV', 'IP_ADDRESS') ip_address,
         SYS_CONTEXT('USERENV', 'NETWORK_PROTOCOL') network_protocol,
         SYS_CONTEXT('USERENV', 'BG_JOB_ID') bg_job_id,
         SYS_CONTEXT('USERENV', 'FG_JOB_ID') fg_job_id,
         SYS_CONTEXT('USERENV', 'AUTHENTICATION_TYPE') authentication_type,
         SYS_CONTEXT('USERENV', 'AUTHENTICATION_DATA') authentication_data   from dual;

 

 

 

 

 








 

 

 

 

 

相关文章
|
3月前
|
负载均衡 Oracle 关系型数据库
Linux启动多个Oracle实例
Linux启动多个Oracle实例
37 0
|
SQL 运维 Oracle
Oracle 超时设置2:设置实例级参数
Oracle超时设置系列的第二篇文章,设置实例级参数
470 0
|
SQL Oracle 关系型数据库
Oracle 数据库利用sql语句判断某个表是否是临时表实例演示,达梦数据库查询出所有临时表
Oracle 数据库利用sql语句判断某个表是否是临时表实例演示,达梦数据库查询出所有临时表
426 0
Oracle 数据库利用sql语句判断某个表是否是临时表实例演示,达梦数据库查询出所有临时表
|
1月前
|
存储 Oracle 关系型数据库
Oracle系列之三:Oracle字符集
Oracle系列之三:Oracle字符集
|
8月前
|
SQL Oracle 关系型数据库
Oracle 19c 启动和关闭实例保存PDB状态
十年以上 MySQL Oracle DBA从业者,MySQL 5.7 OCP, 微信号: jinjushuke
198 0
|
11月前
|
Oracle 关系型数据库
Oracle实例启动失败 ORA-27300 ORA-27301 ORA-27302 新增一个实例,信号量就不够了
我们在一个客户上进行恢复完成后,在RAC的第二个节点,Oracle实例启动失败,有下面的提示信息
|
11月前
|
SQL Oracle 关系型数据库
修改oracle数据库字符集
修改oracle数据库字符集
|
11月前
|
Oracle 关系型数据库 数据库
Oracle实例迁移_真实场景实操
Oracle实例迁移_真实场景实操
78 0
|
11月前
|
SQL Oracle 关系型数据库
oracle修改本机上数据库字符集
oracle修改本机上数据库字符集
|
11月前
|
Oracle Java 关系型数据库
Java操作oracle数据库提示:不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK,问题处理
Java操作oracle数据库提示:不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK,问题处理
618 0