(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. CxSkinButton按钮皮肤类

    在codeproject 发现一个很强大的按钮皮肤类,之前的版本有内存泄露,但是作者已经修复了,原文网址是:http://www.codeproject.com/KB/buttons/cxskinbu ...

  2. Microsoft Visual Studio International Pack 1.0 SR1--关于汉字转拼音

    Microsoft Visual Studio International Pack 1.0 SR1————微软的一个类库 地址:http://www.microsoft.com/zh-cn/down ...

  3. 关于new enhancement的一些知识

    关于new enhancement sap源程序里也给我们留了很多. 以下例句point .section.spot说明这些知识点. 1.不管是point还是section 都是基于spot的,spo ...

  4. Spring Configuration Check Unmapped Spring configuration files found

    Spring Configuration Check Unmapped Spring configuration files found 项目中有xml文件,但没有被用IntelliJ 导入现有工程时 ...

  5. 1.0.x-学习Opencv与MFC混合编程之---视频运动检测

    源代码地址: http://download.csdn.net/detail/nuptboyzhb/3961668 版本1.0.x新增内容 视频运动检测 Ø 新建菜单项,Learning OpenCV ...

  6. [jQuery] check if an id exists - Google 网上论坛

    [jQuery] check if an id exists - Google 网上论坛 From: http://docs.jquery.com/Frequently_Asked_Questions ...

  7. 解决php下多人同时操作数据表

    当同一时刻,多人对同一个表进行insert或者update的时候,往往会出现同一条数据出现好多次或者一些奇怪的问题,可以通过mysql的锁表机制来进行排队解决这个问题 php中插入数据之前锁表 // ...

  8. 修改XPMenu让ToolButton在Down=True时正确显示

    XPMenu是一个不错的程序界面效果控件,但它也存在不少不足之处.我最近又对它作了一点修改. 原因是我在程序里有一个ToolButton,其Style=tbsButton,当Down=True时,XP ...

  9. 五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时

    五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整 ...

  10. 理解 Thread.Sleep 函数

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用 ...