Oracle字符集檢查和修改

Oracle字符集檢查和修改

在部署重構版測試環境時,須要建立Oracle數據庫,使用dbca建立數據庫以後沒有注意數據庫自己的字符集,致使後續全部的數據庫腳本執行後中文亂碼。最後的解決辦法是清掉全庫數據,再修改字符集,重啓數據庫。linux

一、Oracle字符集概述

系統或者程序運行的環境就是一個咱們常見的locale。而設置數據庫locale最簡單的方法就是設置NLS_LANG這個環境參數。在linux中NLS_LANG是一個環境變量,在windows中NLS_LANG是寫在註冊表中的。NLS_LANG這個參數由三個組成部分,分別是語言(language), 區域(territory)和字符集(character set),格式以下:程序員

NLS_LANG = language_territory.charset

咱們平時最多見的就是:AMERICAN_AMERICA.ZHS16GBKSIMPLIFIED CHINESE_CHINA.ZHS16GBKsql

NLS_LANG的做用官網是這樣說的:shell

  • It sets the language and territory used by the client application and the database server. It also sets the client's character set, which is the character set for data entered or displayed by a client program

意思就是說:數據庫

  • NLS_LANG設置了客戶端應用程序和數據庫服務器使用的語言和區域。它還設置了客戶端的字符集,這是客戶端程序用於數據輸入或者顯示的字符集。也就是說若是客戶端字符集和NLS_LANG中的charset不一樣,則會亂碼。

二、檢查Oracle Server字符集

檢查Oracle Server字符集最經常使用的方法有兩種windows

▶查詢nls_database_parameters

select * from nls_database_parameters;

▶使用userenv函數

userenv函數返回當前會話(session)的相關信息。如下sql語句能夠查詢當前會話鏈接的數據庫字符集服務器

select userenv('language') from dual;

有關userenv('parameter')返回值的官網介紹以下session

意思就是:返回的是當前會話使用的language和territory。characterset是數據庫的字符集。oracle

userenv函數的具體使用和當前會話字符集的取值詳見如下連接app

oracle的userenv和nls_lang詳解

三、修改Oracle Server字符集

一旦數據庫建立後,數據庫的字符集理論上講是不能改變的。所以,在設計和安裝之初考慮使用哪種字符集十分重要。根據Oracle的官方說明,字符集的轉換是從子集到超集受支持,反之不行。若是兩種字符集之間根本沒有子集和超集的關係,那麼字符集的轉換是不受oracle支持的。對數據庫server而言,錯誤的修改字符集將會致使不少不可測的後果,可能會嚴重影響數據庫的正常運行,因此在修改以前必定要確認兩種字符集是否存在子集和超集的關係。通常來講,除非萬不得已,咱們不建議修改oracle數據庫server端的字符集。

如下是修改server端字符集的方法——不建議使用

SQL> conn /as sysdba 
SQL> shutdown immediate; 
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; 
ALTER DATABASE CHARACTER SET ZHS16GBK 
* 
ERROR at line 1: 
ORA-12712: new character set must be a superset of old character set 
提示咱們的字符集:新字符集必須爲舊字符集的超集,這時咱們能夠跳過超集的檢查作更改: 
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK; 
SQL> select * from v$nls_parameters; 
重啓檢查是否更改完成: 
SQL> shutdown immediate;  
SQL> startup 
SQL> select * from v$nls_parameters;

具體使用方法參見:oracle服務器和客戶端字符集的查看和修改

四、檢查Oracle Client字符集

windows查看nls_lang

set NLS_LANG

linux查看nls_lang

echo $NLS_LANG

五、修改Oracle Client字符集

修改客戶端字符集只須要修改上述檢查結果中的NLS_LANG便可。

六、整理補充

▶數據庫字符集

select * from nls_database_parameters ;
select userenv('language') from dual;
  • 以上兩種方法取得的都是數據庫字符集,來源於props$,是表示數據庫的字符集。

▶實例字符集

select * from nls_instance_parameters;
  • 主要涉及NLS_LANGUAGE、NLS_TERRITORY的值. NLS_INSTANCE_PARAMETERS其來源於v$parameter

▶會話字符集

select * from nls_session_parameters;
  • 來源於v$nls_parameters,表示會話本身的設置,多是會話的環境變量或者是alter session完成,若是會話沒有特殊的設置,將與nls_instance_parameters一致。

詳見oracle官網:NLS Database Parameters



記得幫我點贊哦!

精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你須要的學習資料,還在等什麼?快去關注下載吧!!!

resource-introduce

念念不忘,必有迴響,小夥伴們幫我點個贊吧,很是感謝。

我是職場亮哥,YY高級軟件工程師、四年工做經驗,拒絕鹹魚爭當龍頭的斜槓程序員。

聽我說,進步多,程序人生一把梭

若是有幸能幫到你,請幫我點個【贊】,給個關注,若是能順帶評論給個鼓勵,將不勝感激。

職場亮哥文章列表:更多文章

wechat-platform-guide-attention

本人全部文章、回答都與版權保護平臺有合做,著做權歸職場亮哥全部,未經受權,轉載必究!

相關文章
相關標籤/搜索