Linux下oracle插入(匯入)中文記錄顯示為問號問題及解決辦法

來源:互聯網
上載者:User

字元集

oracle官方關於字元集和NLS_LANG的解答:http://www.oracle.com/technology/tech/globalization/htdocs/nls_lang%20faq.htm

       
首先要明確什麼是字元集?字元集是一個位元組資料的解釋的符號集合,有大小之分,有相互的包括關係,如us7ascii就是zhs16gbk的子集,
從us7ascii到zhs16gbk不會有資料解釋上的問題,不會有資料丟失,Oracle對這種問題也要求從子集到超集的匯出受支援,反之不行。在所
有的字元集中utf8應該是最大,因為它基於unicode,雙位元組儲存字元(也因此在儲存空間上佔用更多),。

    其次,一旦資料庫建立後,資料庫的字元集是不能改變的。因此,在設計和安裝之初考慮使用哪一種字元集是十分重要的。資料庫字元集應該是作業系統本地字元集的一個超集。存取資料庫的客戶使用的字元集將決定選擇哪一個超集,即資料庫字元集應該是所有客戶字元集的超集。

nls_lang變數:

Windows下:在系統的環境變數裡和註冊表裡可以找到進行設定

Linux下:在oracle使用者下的.bash_profile檔案裡進行設定

NLS_LANG格式:
NLS_LANG = language_territory.charset
有三個組成部分(語言、地區和字元集),每個成分控制了NLS子集的特性。其中:language 指定伺服器訊息的語言。
territory 指定伺服器的日期和數字格式。
charset 指定字元集
例如:
AMERICAN _ AMERICA. ZHS16GBK

linux系統語言:

/etc/sysconfig/i18n

在Red hat下面/etc/sysconfig/i18n的每一行都是什麼意思?

LANG="zh_CN.GB18030"

SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"

SYSFONT="latarcyrheb-sun16"
/etc/sysconfig/i18n 這裡存放的是系統的地區語言設定, i18n是 國際化internationalization的縮寫 i和n之間正好18個字母 

第一行 表明你當前系統的語言環境變數設定 ,這裡是 zh_CN.GB18030

第二行 表明系統預置了那些語言支援 ,不在項目中的語言不能正常顯示

第三行 定義控制台終端字型,你文本登入的時候顯示的字型就是這個 latarcyrheb-sun16
 在匯入匯出oracle資料時,必須將用戶端和oracle伺服器的字元集設定成一致,否則匯入資料庫的中文字元很可能是亂碼而無法正確顯示,然後設定正確的環境變數,然後還要設定作業系統的語言設定,即設定i18n,下面是在伺服器上我實驗例子:
建立表test
SQL> create table test(id number(2),name char(12));
Table created.
然後插入第一條記錄:
SQL> insert into test values(1,'張三');
1 row created.
然後查看:
SQL> select * from test;
        ID NAME

---------- ------------

         1 ????
中文顯示為???
在伺服器上查看資料庫伺服器字元集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')

----------------------------------------------------

AMERICAN_AMERICA.ZHS16GBK

如果是從用戶端插入或者匯入資料必須將用戶端的nls_lang變數設定成與伺服器一致,這裡需將用戶端設定庫:
AMERICAN_AMERICA.ZHS16GBK
查看oracle伺服器的nls_lang變數值:
[oracle@oradb ~]$ echo $NLS_LANG

AMERICAN
修改nls_name變數值為:AMERICAN_AMERICA.ZHS16GBK
然後重新登入再做查詢:
SQL> select * from test;
        ID NAME

---------- ------------

         1 ????
還是問號,做插入測試:
SQL> insert into test values(2,'李四');
1 row created.
SQL> select * from test;
        ID NAME

---------- ------------

         1 ????

         2 ????
檢查i18n檔案:
vi /etc/sysconfig/i18n
LANG="en_US.UTF-8"

SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en"

SYSFONT="latarcyrheb-sun16"
將lang的值修改庫中文字元集,下面是網上比較全的一個i18n檔案設定:
(關鍵)
LANG="zh_CN.gb2312"

SUPPORTED="zh_CN.GB18030:zh_CN:zh:zh_CN.GB2312:zh_CN:zh:zh_CN.gbk:zh_CN:zh:zh_HK.UTF-8:zh_HK:zh:zh_CN.UTF-8:zh_CN:zh:zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8:en_US:en"

SYSFONT="latarcyrheb-sun16"
修改後重新登入oracle,然後進行查詢:
SQL> select * from test;
        ID NAME

---------- ------------

         1 ????

         2 ????
還是無法正確顯示,現在做插入測試:
SQL> insert into test values(3,'王五');

1 row created

SQL> select * from test;
        SQL> select * from test;
        ID NAME

---------- ------------

         1 ????

         2 ????

         3 王五


 OK,現在看到剛插入的可以正常顯示了,但是之前的還是無法顯示,之前插入的記錄由於無法進行正確的轉換,即使修
總結:
就三步:
1:資料庫編碼的字元集(查詢 :select userenv('language') from dual;
2:用戶端編碼的字元集 oracle 修改.bash_profile 檔案。(操作如上)
3:系統的顯示編碼字元集



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.