sqlplus顯示亂碼與三個方面有關
1.數據庫的字符編碼
--查看數據庫的編碼 SELECT * FROM NLS_DATABASE_PARAMETERS;

本例中,可以看到數據庫中字符串(char,varchar2,clob,long)使用的是AL32UTF8編碼存儲,即UTF8存儲。數據庫中的NCHAR,NVARCHAR等使用的是AL16UTF16編碼存儲,即UTF16存儲。
2.客戶端的字符編碼
通過NLS_LANG環境變量進行設置,設置NLS_LANG環境變量的方式有一下三種:
第一種:設置系統環境變量
右鍵《我的電腦》——》《高級系統設置》——》《環境變量》,設置NLS_LANG=AMERICAN_AMERICA.AL32UTF8
第二種:使用注冊表
安裝Oracle客戶端后,Oracle客戶端會自動在注冊表中新增NLS項目並賦值(賦值的編碼跟隨系統設定)
WIN+R——》regedit——》HKEY_LOCAL_MACHINE——》SOFTWARE——》WOW6432Node——》ORACLE——》KEY_OraClient12Home1_32bit(這里要注意,如果安裝的是64位的Oracle,那么直接在SOFTWARE下就可以找到ORACLE)

本例中,跟隨系統的是中文繁體,950為繁體,936為簡體。
第三種:sql developer,pl/sql developer,toad for oracle等客戶端會自動設置NLS(沒有找到在哪里看,但猜測是UTF8)
3.終端的字符編碼
終端的字符編碼分類兩類:
第一類:sqlplus調用的CMD終端

依舊是跟隨系統,設置的為繁體
第二類:toad for oracle等客戶端
這些客戶端會自動設置(沒有看到在哪里看,但猜測是UTF8)
4.從頭到尾過一遍
本例使用sqlplus來過一遍,toad for oracle等客戶端不具有代表性,全部自動設置了
4.1.查看數據庫的字符編碼
SELECT * FROM NLS_DATABASE_PARAMETERS;
因為我測試數據使用的是【varchar2】類型,因此編碼為AL32UTF8
4.2.查看Oracle客戶端的字符編碼
通過2的截圖,可以知道,編碼類型為WIN950,即中文繁體
4.3.查看CMD終端的字符編碼
通過3的截圖,可以知道,編碼類型為950,即中文繁體
4.4.過程梳理
通過以上查詢,可以得出如下流程:當一個查詢發出后,存儲在數據庫中編碼為UTF8的漢字發現客戶端是BIG5,因為會自動轉換,等這個漢字到達客戶單的時候編碼已經變為BIG5了,終端以BIG5的編碼顯示,因此中文繁體的漢字是不會亂碼。但是存儲在數據庫中編碼為UTF8的簡體漢字發現客戶端是BIG5,BIG5中沒有對應簡體的編碼,因此到達客戶端時已經亂碼,在終端顯示肯定為亂碼

接下來修改客戶端編碼為UTF8。這時候,數據庫到客戶端的漢字(繁體或者簡體)都不需要在轉碼了,到達客戶端是UTF8形式編碼的,此時終端使用BIG5顯示,會導致全部亂碼。

接下來我們修改終端編碼為UTF8,此時到達客戶端的是UTF8編碼,終端使用UTF8編碼顯示,就不會亂碼了。
在CMD中使用【chcp 65001】命令可以將CMD編碼設定為UTF8

