2010年11月17日 星期三

[Oracle]處理中文亂碼 -- NLS_LANG設定

開發連結oracle資料庫不可不注意中文的處理問題

首先必須確認DB Server的編碼設定

select userenv('language') from dual;
取得結果為TRADITIONAL_CHINESE.TAIWAN.ZHT16BIG5

接下來就是設定client端的NLS_LANG,只要與DB Server相同,中文顯示就會正確了

1. 開始 -> 執行 -> regedit
2. 找出 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
3. NLS_LANG改為TRADITIONAL_CHINESE.TAIWAN.ZHT16BIG5

這樣由這台client連到TRADITIONAL_CHINESE.TAIWAN.ZHT16BIG5 的DB Server中文顯示就會是正確的。

另一個議題,單一client要連結的DB Server有多種NLS_LANG,擔任Web Server的client常有這種狀況!!!

以ASP.NET為例:

public void ReadMyData(string connectionString)
{
    //設定Oracle NLS_LANG,在connect db前設定環境變數
    System.Environment.SetEnvironmentVariable("NLS_LANG", "AMERICAN_AMERICA.ZHT32EUC");
    string queryString = "SELECT OrderID, CustomerID FROM Orders";
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        OleDbCommand command = new OleDbCommand(queryString, connection);
        connection.Open();
        OleDbDataReader reader = command.ExecuteReader();

        while (reader.Read())
        {
            Console.WriteLine(reader.GetInt32(0) + ", " + reader.GetString(1));
        }
        // always call Close when done reading.
        reader.Close();
    }
}


其關鍵就是
System.Environment.SetEnvironmentVariable("NLS_LANG","AMERICAN_AMERICA.ZHT32EUC");
 
針對單一Web Site設定連線到DB NLS_LANG,就可以一勞永逸的解決中文問題,不管程式被Deploy到哪裡,
都不受那台Web Server的NLS_Lang影響。

4 則留言:

  1. 如果同時要連兩個以上的oracle會不會有問題阿?

    回覆刪除
  2. 我照做了~ 但查詢出來的資料結果也是都是問號
    請問還有別種可能性嗎??? (很急)
    我是在XP環境下~ toad是9.0.1版 ~Client是10g(10.2.0.4)

    回覆刪除
  3. 我也照做了~ 但查詢出來的資料結果也是都是問號
    請問還有別種可能性嗎??? (很急)
    我是在Win7 x64環境下~ toad是12.0.2版 ~Client是11g R2(10.2.0.4)

    回覆刪除
  4. 我是regedit裡面的NLS_LANG已經跟ORACLE一樣了,但還是會有亂碼的現象,後來也是在程式上面SetEnvironmentVariable才解決...看了這篇文章救了一命,感謝

    回覆刪除