Oracle

sqlplus,Linux的編碼問題

  • May 15, 2014

我使用 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

引用自:https://dba.stackexchange.com/questions/19572