看板 Database 關於我們 聯絡資訊
※ 引述《alexcwtzeng ()》之銘言: : ※ 引述《iFEELing (ing)》之銘言: : : 有一台pc 裡面有裝 ORACLE XE Server , ORACLE XE Client, ORACLE 9i Client : : ORACLE XE Server 裡面table裝的是 UTF8 的資料 , 9i client 是接去 : : 另一台 ORACLE Enterprise , 裡面裝的是 ZHT16Big5 的資料 : : 在這台PC裡面使用 PERL 的 DBI DBD::ODBC 接 ORACLE XE 的ODBC Driver : : 可是無論是在系統變數裡面設 NSL_LANG=.ZHT16BIG5 : : 或是在 command lind shell 裡面用 set 設定 : : 或是在 perl 裡面用 ENV 設定, : : 從 XE 吐回來的資料好像都是 UTF8 ... : : 想請教一下還有什麼地方可以調整的呢? 感謝... : 看來好像有兩台 DB?? XE Server 跟 Enterprise 這一台的關係是? : 你的說明有點讓人不清楚。 呃 實際上應該是這樣 在一台PC上有裝 XEServer,XEClient,9iClient (電腦A) 另外有一台 ORACLE 9 Server (電腦B) XE裡的資料是 UTF8 (NVARCHAR2),T_C,AL32UTF8 ORACLE9 Server 裡的資料是 Big5(VARCHAR2),AMERICAN,ZHT16BIG5 電腦A上的程式需要同時讀取 XE (@電腦A)跟 Enterprise(@電腦B) 這兩個 DB 的資料 原本的存取方式是 JSP/Perl <---> ODBC <---> 9iClient ODBC <---> 9iServer <---> XEClient ODBC <---> XE Server : 就字面來說: : Create Database 時用的 Character 是什麼,Database 就是「吐」什麼回來。 : 在 Client 設定 NLS_LANG 粗略的說法是 Display 用的。從 Database 接過來 Decode後 : ,然後顯示在 SQL*Plus 或其他程式中。 : 再來,你說 XE 吐回來的資料「好像」都是 UTF8? 請問你的查法是? 我真的很想知道。 呃 我不是很確定這樣的查法對不對 我是用 perl 的 ODBC Module 去 Connect DB , 把資料用 binary mode dump 到檔案 再用 PsPad 的 HEX 模式去比對字碼。 XE Server 上的資料是經過 XE的 WEB 界面 輸入的。我把該欄位的中文字,在全字庫裡查它的Big5及Unicode編碼 再對照 dump的結果 看起來檔案的內容比較像是 unicode , 但不完全相同 btw,google了接近兩週,我查到一些似乎合理的說法 "由於 ORACLE 是用java程序驅動,NLS_LANG設定僅對非JAVA驅動的程式有作用" 於是我改用 ORACLE 的 JDBC 搭配 JSP 試著存取資料庫 果然可以正確的存取 然後 "NLS_LANG的設定方式可以透過在註冊表中寫,在環境變數中設定, 在cmd shell中使用set命令設定 及在連線中透過 ALTER SESSION 的方式設定" 於是我開始一個一個設 但,在登錄表中,有三個ORACLE , 分別是 ORACLE XE, ORACLE XE Client 及 ORACLE 9i Client, 登錄表中的ORACLE/home 也有三個, 分別是home0 , home1, home2 根據裡面記的資料(好像是path還是什麼吧) 我覺得 home0 應該是 9i client , 於是我更動了 home1,home2 的 NLS_LANG 然後就是一大堆home0 home1 home2 的比對交叉測試 花了我快兩週 我老闆的 臉色也越來越糟 XD 最後我解決的方式是 JSP <--> ORACLE JDBC <--> XE & Enterprise , JSP的encoding編碼設成UTF8 , XE/Enterprise 吐回來的資料也是 UTF8 Perl <--> Microsoft Oracle Client Driver <--> XE & Enterprise NLS_LANG 則是不管在 登錄表(XE,XEclient,Oracle/Home0,1,2),環境變數, 以及 Perl 中透過 ENV{} 的方式 通通設成 Big5 , 吐回來的也是 BIG5 然後,再透過Perl的Encode Module 轉成UTF8. 目前是大至上看起來正常啦...下週開始給客戶試用就曉得會不會包了 XD ---- 所以最後的結論就是, 用ODBC時 NLS_LANG設好 給 ORACLE Client自己轉, 這樣反而會得到正確的Big5 , 至於用 UTF8 透過JSP / JAVA 去連 ODBC的UTF8目前還不曉得該怎麼辦 這是我第一次碰ORACLE , 之前都在用 MySQL ...不是很瞭解這個大怪獸的邏輯:P 感謝您的回應~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.134.36.154