iT邦幫忙

0

visual studio 使用 c# 讀取資料庫 亂碼問題 (Oracle)

  • 分享至 

  • xImage

伺服器端的編碼是
https://ithelp.ithome.com.tw/upload/images/20211230/20140491U6NjYdHL9o.png

C# 語法讀取出來的亂碼 https://ithelp.ithome.com.tw/upload/images/20211230/20140491FeEqwJ9Dbf.png

如何讓它正確顯示而不是亂碼呢?

補充:如何用c#取得字串是什麼編碼方式嗎?

2022/01/03 補充:

我發現打開 Sql Plus 有些也是亂碼...

https://ithelp.ithome.com.tw/upload/images/20220103/20140491zCkcd95H7O.png

是用Oracle

--------------------------------
2022/01/03 13:11 /images/emoticon/emoticon02.gif

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

補充2022/01/03 15點15分: 我試著 create一個table 之後,char(50)格式,再次select 之後,發現剛剛create的中文字變成了亂碼 (?w?w) 我原本INSERT INTO色的中文字是"安安",請問該如何解決呢???

補充2022/01/03 15點15分: 我試著 create一個table 之後,char(50)格式,再次select 之後,發現剛剛create的中文字變成了亂碼 (?w?w) 我原本INSERT INTO色的中文字是"安安",請問該如何解決呢???
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
尼克
iT邦大師 1 級 ‧ 2021-12-30 09:30:13
最佳解答
看更多先前的回應...收起先前的回應...

尼克要先將我的電腦設定和伺服器端的編碼相同可以正確看見編碼後再進行轉換對嗎?

我電腦(客戶端) 撈出 伺服器(伺服器端) 看見是 "???" 代表我也看不見正確的編碼是嗎?

尼克 iT邦大師 1 級 ‧ 2021-12-30 10:59:18 檢舉

確認Oracle編碼

SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
-- or
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET');
-- or
SELECT USERENV('LANGUAGE') FROM DUAL;

C# 編碼方式程式修改方式:
System.Environment.SetEnvironmentVarible("NLS_LANG ","修改為編碼格");

查詢出來是 US7ASCII

System.Environment.SetEnvironmentVarible("NLS_LANG ","US7ASCII");

這樣對嗎?

尼克

System.Environment.SetEnvironmentVarible("NLS_LANG ","US7ASCII");

要放在程式碼哪邊呢?

尼克

// 連接字串
string connString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.XXX.XXX)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XXX)));Persist Security Info=True;User ID=XXX;Password=XXX";
try
            {
                //測試:通過DataReader簡單查詢
                using (DbConnection con = new OracleConnection(connString))
                {
                    con.Open();
                    using (DbCommand com = con.CreateCommand())
                    {
                        com.CommandText = "SELECT * FROM 資料表";
                        using (DbDataReader reader = com.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                Console.Write($"{reader["ID"].ToString()}---" +
                                              $"{reader["NAME"].ToString()}---");
                                Console.WriteLine();
                            }
                        }
                    }
                    Console.WriteLine("查詢完畢!"); ;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            Console.ReadKey();

尼克
https://ithelp.ithome.com.tw/upload/images/20211230/201404912f5Bie5e47.png
目前亂碼的顯示

尼克 iT邦大師 1 級 ‧ 2021-12-30 11:41:40 檢舉

你測試看看
C#操作Oracle数据库中文乱码 US7ASCII字符集 (解决方案)
我以前都沒用過這一個編碼 US7ASCII

尼克 iT邦大師 1 級 ‧ 2021-12-30 11:47:48 檢舉

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

  1. 開始 -> 執行 -> regedit
  2. 找出 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
  3. NLS_LANG改為與DB同編碼
    測試看看。

尼克
我的登錄編輯程式找不到路徑:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 裡面的 NLS_LANG

只在這個路徑
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE\KEY_OraClient11g_home1 裡面找到 NLS_LANG

該改後重開機登入還是無效

尼克 iT邦大師 1 級 ‧ 2021-12-30 14:18:22 檢舉

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE\KEY_OraClient11g_home1 裡面找到 NLS_LANG
64位元regedit在這裡沒錯,你的Oracle是那一個版本?

尼克https://ithelp.ithome.com.tw/upload/images/20211230/20140491AOEkBs8Xir.png
這個版本

尼克 iT邦大師 1 級 ‧ 2021-12-30 15:31:25 檢舉
select * from v$version

你既然使用Oracle SQL Developer查詢看到是正常嗎?

尼克
因為伺服端查詢出來是

TRADITIONAL CHINESE_TAIWAN.US7ASCII

我也將機碼改為

TRADITIONAL CHINESE_TAIWAN.US7ASCII

還是不能正常顯示

尼克 iT邦大師 1 級 ‧ 2021-12-30 15:58:17 檢舉

我沒辦法了,看看其他幫友是否有其它方式!

尼克 iT邦大師 1 級 ‧ 2021-12-30 15:59:07 檢舉

你是用ODAC的安裝元件是嗎?64位元32位元?

JellyHugo iT邦新手 2 級 ‧ 2021-12-31 21:12:09 檢舉

新手不付責任詢問 :
1.資料庫內的資料在使用資料庫管理器查看時,是否正常(會不會是資料本身就有問題?)
2.電腦是Windows系統的話,本機的非Unicode語言有沒有設定正確?https://ithelp.ithome.com.tw/upload/images/20211231/20125621Rn3y1j1SSa.png

尼克
這是我電腦上OBDC的版本資訊 32位元
https://ithelp.ithome.com.tw/upload/images/20220103/20140491c8Gm2DIRkV.png

用 Oracle SQL Developer 撈出的會顯示這個
https://ithelp.ithome.com.tw/upload/images/20220103/201404915rHw0wER94.png

用Visual studio 2017 撈出的會顯示這個
https://ithelp.ithome.com.tw/upload/images/20220103/20140491AOEdOKDfQn.png

JellyHugo

設定上和你截圖上面是一樣的, 中文(繁體,台灣)

用 Oracle SQL Developer 撈出的會顯示這個
https://ithelp.ithome.com.tw/upload/images/20220103/20140491xDGGDbQcWG.png

用Visual studio 2017 撈出的會顯示這個https://ithelp.ithome.com.tw/upload/images/20220103/20140491EqVX12zhgP.png

我發現打開 Sql Plus 有些也是亂碼...

https://ithelp.ithome.com.tw/upload/images/20220103/20140491izxzUEqgBN.png

補充: 我試著 create一個table 之後,char(50)格式,再次select 之後,發現剛剛create的中文字變成了亂碼 (?w?w) 我原本INSERT INTO色的中文字是"安安",請問該如何解決呢???

尼克 iT邦大師 1 級 ‧ 2022-01-03 15:39:20 檢舉
JellyHugo iT邦新手 2 級 ‧ 2022-01-05 09:20:23 檢舉

若直接執行 Select '中文' From Dual 會有什麼結果呢?

JellyHugo
顯示了

'

?

'

?

尼克 iT邦大師 1 級 ‧ 2022-01-05 10:48:15 檢舉
CREATE TABLE nvarchar2_demo (
    description NVARCHAR2(50)
);

使用nvarchar2測試看看

我要發表回答

立即登入回答