sqlplus,Linux的編碼問題
我使用 sqlplus,所有非拉丁字元都顯示為“?” 當我執行選擇查詢時。當我使用非拉丁字元執行插入或更新查詢時,我會在網頁上看到問號。
select * from nls_database_parameters;
給NLS_CHARACTERSET: AL32UTF8
. 我已經導出了 NLS_LANG 變數:export NLS_LANG=RUSSIAN_CIS.AL32UTF8
,但這並沒有做任何改變。問題是什麼?當然,我在 Linux 終端中使用 UTF-8,我可以看到正在執行的腳本文件內容
cat script.sql
。如果我執行
alter session set nls_language='russian'
,我也會在 ora-xxxxx 消息中遇到問號。
由於您確認數據庫中的字元集是 AL32UTF8,因此您需要確保在 Linux 機器上安裝了字型,並安裝了消息庫。當您執行時,這將使 ORA_NLS33 已設置出現
alter session set nls_language=
NLS_LANG 用於告訴數據庫客戶端使用哪個字元集,以便在客戶端和數據庫之間傳輸字元時可以正確翻譯這些字元。有一篇 Oracle Metalink 文章解釋了 NLS_LANG 參數,其中包含對其他重要文章的大量引用:NLS_LANG Explained (How does Client-Server Character Conversion Work?) (Doc ID 158577.1)
它既不用於告訴客戶端數據庫使用哪個字元集,因為這不是必需的。客戶端知道數據庫的字元集,因為它連接到它。它也不是用來告訴數據庫它正在使用哪個字元集,因為數據庫知道它正在使用哪個字元集。
所以簡單地將 NLS_LANG 設置為數據庫的字元集是錯誤的。這是破壞數據庫中角色數據的好方法
NLS_LANG 變數的目的是告訴 Oracle 客戶端您的 unix/windows/… 系統正在使用哪個字元集。
那麼你必須設置你的 NLS_LANG 變數的值是多少?在 Linux 系統上執行以下操作:
$本地 LANG= LC_CTYPE=en_US.ISO8859-1 LC_NUMERIC=C LC_TIME=en_US.ISO8859-1 LC_COLLATE=en_US.ISO8859-1 LC_MONETARY=en_US.ISO8859-1 LC_MESSAGES=C LC_ALL=
unix系統的字元集由LANG、LC_CTYPE和LC_ALL定義。LANG 被 LC_CTYPE 覆蓋,LC_CTYPE 又被 LC_ALL 覆蓋。所以在這種情況下,必須是 NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1。此設置與數據庫的字元集無關。
所以首先你必須檢查你的語言環境並適當地設置 NLS_LANG。
還有一些其他的事情可能會出錯,例如數據庫已經損壞數據或終端配置不正確。
兩個解釋 unix 語言環境設置的參考資料。 https://unix.stackexchange.com/questions/87745/what-does-lc-all-c-do
http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Locale-Categories .html