2016-04-19 165 views
4

我在這裏有一個快速問題,我想知道在oracle中設置NLS_NCHAR_CHARACTERSET和NLS_CHARACTERSET的區別 ?NLS_NCHAR_CHARACTERSET abd NLS_CHARACTERSET與Oracle之間的差異

從我的理解NLS_NCHAR_CHARACTERSET是爲NVARCHAR數據類型 和NLS_CHARACTERSET將爲VARCHAR2數據類型。

我試圖測試這個我開發服務器,我的CHARACTERSET當前設置是以下上: -

PARAMETER      VALUE 
------------------------------ ---------------------------------------- 
NLS_NCHAR_CHARACTERSET   AL16UTF16 
NLS_NUMERIC_CHARACTERS   ., 
NLS_CHARACTERSET    US7ASCII 

然後我插入一些中國字符值到數據庫中。我將這些字符插入一個名爲data_的表中,並更新了ADDRESS和ADDRESS_2這兩列是VARCHAR2列。根據我對NLS_CHARACTERSET US7ASCII當前設置的理解,不應該支持中文字符,但它仍然顯示在數據庫中? NLS_NCHAR_CHARACTERSET優先於此?

謝謝。

+2

你不應該複製截圖。複製/粘貼SQL Plus中的文本,並將代碼格式設置爲 –

+0

。感謝指出:) –

回答

4

一般而言,所有的觀點都是正確的。 NLS_NCHAR_CHARACTERSET定義了NVARCHAR2等的字符集。人。而NLS_CHARACTERSET用於VARCHAR2

爲什麼你可能看到中文字符US7ASCII

原因是,您的數據庫字符集和客戶端字符集(即參見NLS_LANG值)都是US7ASCII。您的數據庫使用US7ASCII,它也「認爲」客戶端使用US7ASCII發送數據。因此,它不會對字符串進行任何轉換,數據會從客戶端一對一地傳輸到服務器,反之亦然。

由於這個原因,您可以使用US7ASCII實際不支持的字符。請注意,如果客戶端使用不同的字符集(例如,當您在Windows應用程序中使用ODP.NET託管驅動程序),則數據將是垃圾!另外,如果你想考慮一個數據庫字符集遷移,你有同樣的問題。

另一個說明:我不認爲你會得到與其他字符集相同的行爲,例如,例如,如果您的數據庫和客戶端都使用WE8ISO8859P1。另外請注意,你實際上有錯誤的配置。你的數據庫使用字符集US7ASCII,你的NLS_LANG值也是US7ASCII(很可能它根本沒有設置,Oracle默認爲US7ASCII),但是SQL * Plus的真正字符集,您的cmd.exe終端最有可能是CP950CP936

如果你想設置的一切正常,你可以設置你的環境變量NLS_LANG=.ZHT16MSWIN950(CP936似乎Oracle不支持)或命令chcp 437運行sqlplus.exe前更改您的代碼頁。有了這個適當的設置,你不會看到任何中文字符,因爲你可能會預期。

+0

感謝解釋=)。我認爲我知道了嘿嘿;) –