(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)
'中文' X XB
------ ---------- ----------
中文 2 4
目標數據庫:(UTF8)
'中文' X XB

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

中文 2 6
做了一個表測試了一下:
在源數據庫里:


Table created

SQL> insert into cntable(fname) values('張三');
1 row inserted

在目標數據倉庫里:


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;