SQLPlus執行UTF-8編碼指令檔

作業環境有個需求: 有一些PL/SQL DDL指令需先匯成sql檔,再透過程式呼叫SQLPlus.exe執行。

SQLPlus.exe可讀入SQL Script檔案直接執行,例如: sqlplus –s user/pwd @script.sql,而透過程式啟動外部EXE也不是問題,一切看似小菜一碟...

BUT! 人生最厲(ㄐㄧ)害(ㄨㄞ)的就是這個BUT!

問題出在SQLPlus在命令提示視窗(Command Prompt)執行,只支援ANSI編碼,而script.sql可能包含Unicode文字,故得用UTF-8編碼。沒想到這小小的編碼要求,最後得五關斬六將方能達成。

先來個簡單測試,用Notepad++新增chinese.sql,存成UTF-8編碼。將Command Prompt設成CodePage 65001,type chinese.sql可以看到"SELECT '中文測試' FROM DUAL;",驗證是UTF-8無誤。呼叫sqlplus執行,出現unknown command beginning錯誤,而SELECT指令前方有一個無法識別字元,推測是BOM作祟。

利用Notepad++將檔案轉存為"UTF-8 without BOM"。(此時下方的編碼顯示會由UTF-8變成"ANSI as UTF-8")

再執行一次,看來執行成功,sqlplus該呈現的中文全變成"?"是怎麼一回事? 在網路找到文章,提到設NLS_LANG及使用SPOOL將結果輸出到檔案的技巧,改寫成spool.sql,終於成功繞過sqplus受限ANSI編碼的限制,在result.txt取得正確執行結果:

如果.sql中包含Unicode難字,則要使用N'…'以及ORA_NCHAR_LITERAL_REPLACE環境變數,一樣能克敵致勝:

最後,除了靠SPOOL,SQLPlus真的沒法讀取UTF-8直接顯示中文嗎? 先前參考的文章提過一招密技,使用PowerShell ISE... 娘子啊,跟牛魔王出來看中文:

【參考資料】

歡迎推文分享:
Published 24 May 2014 09:40 AM 由 Jeffrey
Filed under: ,
Views: 17,665



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<May 2014>
SunMonTueWedThuFriSat
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication