Oracle字符集檢查和修改
在部署重構版測驗環境時,需要創建Oracle資料庫,使用dbca創建資料庫之后沒有注意資料庫本身的字符集,導致后續所有的資料庫腳本執行后中文亂碼,最后的解決辦法是清掉全庫資料,再修改字符集,重啟資料庫,
1、Oracle字符集概述
系統或者程式運行的環境就是一個我們常見的locale,而設定資料庫locale最簡單的方法就是設定NLS_LANG這個環境引數,在linux中NLS_LANG是一個環境變數,在windows中NLS_LANG是寫在注冊表中的,NLS_LANG這個引數由三個組成部分,分別是語言(language), 區域(territory)和字符集(character set),格式如下:
NLS_LANG = language_territory.charset
我們平時最常見的就是:AMERICAN_AMERICA.ZHS16GBK和SIMPLIFIED CHINESE_CHINA.ZHS16GBK
NLS_LANG的作用官網是這樣說的:
- 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不同,則會亂碼,
2、檢查Oracle Server字符集
檢查Oracle Server字符集最常用的方法有兩種
?查詢nls_database_parameters
select * from nls_database_parameters;
?使用userenv函式
userenv函式回傳當前會話(session)的相關資訊,以下sql陳述句可以查詢當前會話連接的資料庫字符集
select userenv('language') from dual;
有關userenv('parameter')回傳值的官網介紹如下

意思就是:回傳的是當前會話使用的language和territory,characterset是資料庫的字符集,
userenv函式的具體使用和當前會話字符集的取值詳見以下鏈接
oracle的userenv和nls_lang詳解
3、修改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服務器和客戶端字符集的查看和修改
4、檢查Oracle Client字符集
windows查看nls_lang
set NLS_LANG
linux查看nls_lang
echo $NLS_LANG
5、修改Oracle Client字符集
修改客戶端字符集只需要修改上述檢查結果中的NLS_LANG即可,
6、整理補充
?資料庫字符集
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

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

念念不忘,必有回響,小伙伴們幫我點個贊吧,非常感謝,
我是職場亮哥,YY高級軟體工程師、四年作業經驗,拒絕咸魚爭當龍頭的斜杠程式員,
聽我說,進步多,程式人生一把梭
如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激,
職場亮哥文章串列:更多文章

本人所有文章、回答都與著作權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/81230.html
標籤:Oracle
上一篇:掌握這13個MySQL索引知識點,讓你面試通過率翻倍
下一篇:資料庫陳述句書寫
