今天下午,在測試庫上偶然發現:
alter session set nls_language='american'; 後
show parameter nls
這個nls_language參數竟然沒有變
執行:select * from v$nls_parameters; (查看當前session的)
這個值變了;
也就是說我alter session set nls_language='american';修改當前會話的此參數是沒錯的
那爲什麼show parameter nls中的值沒變呢?
------------------------------------------------------------------------------------------------------------------------------------
找了一下午,總算有點眉目了
關於NLS相關的參數,比較特殊:
它有三個檔:
1、數據庫服務器字符集:select * from nls_database_parameters,其來源於props$,是表示數據庫的字符集。
2、客戶端字符集環境:select * from nls_instance_parameters,其來源於v$parameter , 表示客戶端的字符集的設置
----這就是show parameter nls中的參數(show parameter 顯示的就是v$parameter 中的值)
3、當前會話的字符集:select * from nls_session_parameters,其來源於v$nls_parameters,表示會話自己的設置
----我們alter session set nls_language='AMERICAN'; 改的就是會話的字符集
所以說我們alter session set nls_language='AMERICAN'; 後show parameter nls中的值並沒有變;
因爲NLS相關的參數比較特殊,show parameter nls 顯示的是instance檔的,而不是當前session的;
別的參數,show parameter 顯示的是當前session的
*****************補充********************
SQL> select * from nls_database_parameters;
PARAMETER VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY ?
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET ZHS16GBK
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
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 TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY ?
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 11.2.0.1.0
20 rows selected
數據庫字符集(NLS_CHARACTERSET):表中CHAR, VARCHAR2, CLOB, LONG等類型數據用數據庫字符集
國家字符集(NLS_NCHAR_CHARACTERSET):表中NCHAR, NVARCHAR2, NCLOB等類型數據用國家字符集
其實大部分情況我們都是用的數據庫字符集,國家字符集用的很少,僅作爲一個補充
US7ASCII ----英文字符集(老外用)
zhs16cgb231280 ----進化後就是ZHS16GBK
AL32UTF8 -----數據庫字符集(跨國企業)
AL16UTF16 ----國家字符集就用這個,不用別的
ZHS16GBK --- 數據庫字符集(就中國人用)
utf8 ---進化後就是AL32UTF8
國家字符集就用AL16UTF16
如果你的數據庫可能要涉及到多個國家的語言,那數據庫字符集選 AL32UTF8
如果你的數據庫就中國人用,那就選 ZHS16GBK,以爲ZHS16GBK要比AL32UTF8字符編碼佔的空間少,性能更好