oracle服务端字符集
一、oracle服務(wù)端字符集
SQL> select userenv('language') from dual ;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
二、oracle客戶段字符集
2.1 window環(huán)境下,修改注冊(cè)表ORACLE_HOME目錄下的環(huán)境變量NLS_LANG。
2.2 unix/linux環(huán)境下,就是環(huán)境變量$NLS_LANG
[python@master ~]$ echo $NLS_LANG
[python@master ~]$ locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
NLS_LANG=語言_地域_客戶端字符集 ?
(1).數(shù)據(jù)庫服務(wù)器字符集
select * from nls_database_parameters
來源于props$,是表示數(shù)據(jù)庫的字符集。
(2).客戶端字符集環(huán)境
select * from nls_instance_parameters
其來源于v$parameter,表示客戶端的字符集的設(shè)置,可能是參數(shù)文件,環(huán)境變量或者是注冊(cè)表
(3).會(huì)話字符集環(huán)境
select * from nls_session_parameters
來源于v$nls_parameters,表示會(huì)話自己的設(shè)置,可能是會(huì)話的環(huán)境變量或者是alter session完成,如果會(huì)話沒有特殊的設(shè)置,將與nls_instance_parameters一致。
5.1 修改server端字符集(不建議使用)
1.關(guān)閉數(shù)據(jù)庫
SQL>SHUTDOWN IMMEDIATE
2. 啟動(dòng)到Mount
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
--這里可以從父集到子集
SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
SQL>ALTER DATABASE NATIONAL CHARACTER SET ZHS16GBK;
--如果是從子集到父集,需要使用INTERNAL_USE 參數(shù),跳過超子集檢測(cè)
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL32UTF8;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
注意:如果沒有大對(duì)象,在使用過程中進(jìn)行語言轉(zhuǎn)換沒有什么影響,(切記設(shè)定的字符集必須是ORACLE支持,不然不能start) 按上面的做法就可以。
若出現(xiàn)‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 這樣的提示信息,
要解決這個(gè)問題有兩種方法
1. 利用INTERNAL_USE 關(guān)鍵字修改區(qū)域設(shè)置,
2. 利用re-create,但是re-create有點(diǎn)復(fù)雜,所以請(qǐng)用internal_use
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP MOUNT EXCLUSIVE;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;
SQL>SHUTDOWN immediate;
SQL>startup;
如果按上面的做法做,National charset的區(qū)域設(shè)置就沒有問題
?
5.2 修改dmp文件字符集
上文說過,dmp文件的第2第3字節(jié)記錄了字符集信息,因此直接修改dmp文件的第2第3字節(jié)的內(nèi)容就可以‘騙’過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒有子集和超集關(guān)系的情況下也可以修改,我們常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因?yàn)楦牡闹皇莇mp文件,所以影響不大。
具體的修改方法比較多,最簡(jiǎn)單的就是直接用UltraEdit修改dmp文件的第2和第3個(gè)字節(jié)。
比如想將dmp文件的字符集改為ZHS16GBK,可以用以下SQL查出該種字符集對(duì)應(yīng)的16進(jìn)制代碼:
SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
0354
然后將dmp文件的2、3字節(jié)修改為0354即可。
如果dmp文件很大,用ue無法打開,就需要用程序的方法了。
5.3客戶端字符集設(shè)置方法
???? 1)UNIX環(huán)境
???????? $NLS_LANG=“simplified chinese”_china.zhs16gbk
???????? $export NLS_LANG
???????? 編輯oracle用戶的profile文件
??? 2)Windows環(huán)境
???????? 編輯注冊(cè)表
???????? Regedit.exe ---》 HKEY_LOCAL_MACHINE ---》SOFTWARE ---》 ORACLE-HOME
?或者在窗口設(shè)置:
??????? set nls_lang=AMERICAN_AMERICA.ZHS16GBK
轉(zhuǎn)載于:https://www.cnblogs.com/hello-wei/p/9924002.html
總結(jié)
以上是生活随笔為你收集整理的oracle服务端字符集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享2018年陆陆续续读过的书-附书单
- 下一篇: 6.2 二叉树的定义、性质与存储结构