(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;

更改Oracle实例的字符集的更多相关文章

  1. 转:更改SQLServer实例默认字符集

    需求 安装数据库时,将字符集安装成了“SQL_Latin1_General_CP1_CI_AS”,现在需要将其更改为“Chinese_PRC_CI_AS”.   方法 重新生成系统数据库 ,然后还原配 ...

  2. 更改SQLServer实例默认字符集

    转自http://www.cnblogs.com/fygh/archive/2012/05/15/2501598.html 需求 安装数据库时,将字符集安装成了“SQL_Latin1_General_ ...

  3. oracle数据库的字符集更改

    A.oracle server 端 字符集查询  select userenv('language') from dual 其中NLS_CHARACTERSET 为server端字符集 NLS_LAN ...

  4. 更改oracle字符集

    修改oracle字符集 方法/步骤   oracle数据库的字符集更改 A.oracle server 端 字符集查询  select userenv('language') from dual 其中 ...

  5. 更改Oracle字符集避免乱码

    如何更改Oracle字符集避免乱码 转一位大神的笔记. 国内最常用的Oracle字符集ZHS16GBK(GBK 16-bit Simplified Chinese)能够支持繁体中文,并且按照2个字符长 ...

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

    转一位大神的笔记. 国内最常用的Oracle字符集ZHS16GBK(GBK 16-bit Simplified Chinese)能够支持繁体中文,并且按照2个字符长度存储一个汉字.UTF8字符集是多字 ...

  7. 更改oracle数据库字符集

    A.oracle server 端 字符集查询  select userenv('language') from dual 其中NLS_CHARACTERSET 为server端字符集 NLS_LAN ...

  8. Linux下更改oracle客户端字符集和服务端字符集

    from:http://blog.csdn.net/chid/article/details/6166506 Linux 下更改 oracle 客户端字符集和服务端字符集 1.Linux 下更改 or ...

  9. 【DBA-Oracle】更改Oracle数据字符集_转为常用的ZHS16GBK

    A.oracle server 端 字符集查询  select userenv('language') from dual 其中NLS_CHARACTERSET 为server端字符集 NLS_LAN ...

随机推荐

  1. 基于visual Studio2013解决面试题之1007鸡蛋和篮子

     题目

  2. 基于visual Studio2013解决C语言竞赛题之1026判断排序

          题目 解决代码及点评 /********************************************************************** ...

  3. JS将秒换成时分秒

    function formatSeconds(value) {    var theTime = parseInt(value);// 秒    var theTime1 = 0;// 分    va ...

  4. [REST Jersey] @QueryParam Demo

    This demo sourced from the jersey tutor. https://jersey.java.net/documentation/latest/jaxrs-resource ...

  5. ASC(22)H(大数+推公式)

    High Speed Trains Time Limit: 4000/2000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Su ...

  6. tomcat加载时报The web application [/dmscs] created a ThreadLocal with key of type

    严重: The web application [/dmscs] created a ThreadLocal with key of type [com.opensymphony.xwork2.inj ...

  7. FZOJ2111:Min Number

    Problem Description Now you are given one non-negative integer n in 10-base notation, it will only c ...

  8. Linux 二层协议架构组织

    本文主要讲解了Linux 二层协议架构组织,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了Linux 二层协议架构组织,希望可以对大家有所帮助 ...

  9. ORA-00942:表或视图不存在(低级错误)

    在好多时候.调试PL/SQL对象时会报.ORA-00942 看看错误原因吧: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFjc29uX2JhaQ== ...

  10. OpenCV Python教程(3、直方图的计算与显示)

    转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...