台灣最大程式設計社群網站
線上人數
1657
 
會員總數:246145
討論主題:189731
歡迎您免費加入會員
討論區列表 >> Oracle >> 請問 NLS_LANG 問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
請問 NLS_LANG 問題
價值 : 160 QP  點閱數:23683 回應數:2
樓主

Justin
門外漢
0 16
290 19
發送站內信

有兩個問題想請教各位有經驗的前輩,已在 google 上找了好久找不到詳細的答案。

1. 我要 select 一個 view,那個 view 確定是有資料的,但是我 select 都說沒有資料,
當時我 client 的 NLS_LANG = TRADITIONAL CHINESE_TAIWAN.ZHT16BIG5,
後來把 NLS_LANG 改為 AMERICAN_AMERICA.ZHT16BIG5 後,就能查詢到 view 裡面的資料了。
我上網查了好久,只查到的確有這個現象,卻沒有人說明原因,不知是否有人能替我解答?
謝謝。

2. 我 select 一個 DB 的資料,該 DB server 端的 chracter set 是 UTF8,
所以我 client 端設定 NLS_LANG 為 UTF8,但這樣去查詢反而會出現亂碼,
要設成 Big5 去查詢才會正確,通常 client 端和 server 端的 codepage 不是要一致嗎?
為什麼我設成一致的反而會有亂嗎?謝謝。

搜尋相關Tags的文章: [ NLS_LANG ] , [ nls_lang ] , [ big5 ] , [ utf8 ] , [ view ] ,
本篇文章發表於2012-04-18 14:47
1樓
回應

花旗蔘
檢舉此回應
-----我的環境
SQL> select * from nls_database_parameters where parameter like '%CHARACTERSET%';

PARAMETER VALUE
---------------- ---------------------------
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16



1. 我要 select 一個 view,那個 view 確定是有資料的,但是我 select 都說沒有資料,
當時我 client 的 NLS_LANG = TRADITIONAL CHINESE_TAIWAN.ZHT16BIG5,
後來把 NLS_LANG 改為 AMERICAN_AMERICA.ZHT16BIG5 後,就能查詢到 view 裡面的資料了。
我上網查了好久,只查到的確有這個現象,卻沒有人說明原因,不知是否有人能替我解答?
謝謝。

A:
建議CHECK 一下 你view 裡面SQL 語法的條件子句,
若有條件子句,去掉 再試試 看是不是仍是一樣的情況,

個人認為應該是條件子句裡 有被client的NLS參數影嚮 EX:NLS_CURRENCY,......

可以的話PO上來看看!!


2. 我 select 一個 DB 的資料,該 DB server 端的 chracter set 是 UTF8,
所以我 client 端設定 NLS_LANG 為 UTF8,但這樣去查詢反而會出現亂碼,
要設成 Big5 去查詢才會正確,通常 client 端和 server 端的 codepage 不是要一致嗎?
為什麼我設成一致的反而會有亂嗎?謝謝。

-----做個例子 給您參考,這樣應該就明白了
create table ben(a varchar2(50));

---SET NLS_LANG=TRADITIONAL CHINESE_TAIWAN.ZHT16BIG5
insert into ben values('金城武');
commit;
---SET NLS_LANG=AMERICAN_AMERICA.AL32UTF8
insert into ben values('金城六');
commit;

----SET NLS_LANG=TRADITIONAL CHINESE_TAIWAN.ZHT16BIG5
select a,dump(a) from ben

金城武 Typ=1 Len=9: 233,135,145,229,159,142,230,173,166
?????? Typ=1 Len=6: 170,247,171,176,164,187


---SET NLS_LANG=AMERICAN_AMERICA.AL32UTF8
select a,dump(a) from ben

??甇 Typ=1 Len=9: 233,135,145,229,159,142,230,173,166
金城六 Typ=1 Len=6: 170,247,171,176,164,187

------------------------------
本篇文章回覆於2012-04-18 18:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

fantasy
捐贈 VP 給 fantasy 檢舉此回應
NLS_LANG的參數用法為Language_Territory.Character_Set,其中Language是用來指定顯示訊息格式、日期名稱、月份名稱;Territory則是在計算天與週過程中所使用的轉換與處理方式;Character_Set是控制顯示訊息的字元集

Chinese (PRC):SIMPLIFIED CHINESE_CHINA.ZHS16GBK

Chinese (Taiwan):TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950

English (United States):AMERICAN_AMERICA.WE8MSWIN1252


Q1:NLS_LANG設定AMERICAN_AMERICA.ZHT16BIG5才看的到資料
A:那是因為該view有多語言功能,而您目前設定"AMERICAN_AMERICA"才看的到資料,就是設定語言為US...
若設定為ZHT,則NLS_LANG設成TRADITIONAL CHINESE_TAIWAN才看的到資料

Q2:DB端設定UT8字集,Client端要設定ZHT16BIG5才看的到資料
A:詳細真正原因在下也不太清楚,但您有這個問題,該不會您這是使用Oracle ERP所遇到的情況吧?

本篇文章回覆於2012-04-20 09:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.