2010-11-02 16 views
4

如何以UTF-8格式將Oracle數據庫中的數據轉換爲文本文件,並使用所有UTF-8字符正確顯示,例如漢字。如何將Oracle數據庫中的UTF-8格式數據轉換爲文本文件

我想從Oracle數據庫中啓用UTF-8並試圖將相同數據緩存到txt或cvs中的數據。我得到????而不是漢字。

我知道這個問題已經提出過,但沒有給出答案,因此再次重新提出這個問題。

批處理程序:

sqlplus snprn/[email protected]_VM.WORLD @C:\BatchJob\SPOTReport\spotreport.SQL 

rem sqlplus snprn/[email protected] @C:\BatchJob\SPOTReport\spotreportrecovery.SQL 

rem copy Spot_Item_details*.* C:\BatchJob\SPOTReport /y 
copy Spot_Item_details*.* C:\BatchJob\SPOTReport /y 
rem xcopy Spot_Item_details*.* backup /y 
rem del Spot_Item_details*.*  

SQL代碼:

SET HEADING ON 
SET FEEDBACK OFF 
SET ECHO OFF 
SET LINESIZE 5000 
SET PAGESIZE 0 
SET TRIMS ON 
SET ARRAYSIZE 5 


COLUMN extract_date NEW_VALUE _date 
SELECT TO_CHAR(SYSDATE, 'RRRRMMDD') extract_date 
FROM DUAL; 

SPOOL D:\SPOT2\BatchJob\SPOTReport\Spot_Item_details_daily_&_Date.txt 

Select 'SPOT#'||'^'|| 
'STATUS'||'^'|| 
'APPLY DATE'||'^'|| 
'MANAGER SIGNOFF'||'^'|| 
'SNP OPS SIGNOFF'||'^'|| 
'GP SIGNOFF'||'^'|| 
'DIR SIGNOFF'||'^'|| 
'SCM SIGNOFF'||'^'|| 
'ITEM NO'||'^'|| 
'ISMARTS SKU'||'^'|| 
'MANUFACTURER SKU'||'^'|| 
'COUNTRY'||'^'|| 
'DISTRIBUTOR'||'^'|| 
'DISTRIBUTOR STD PRICE EX GST'||'^'|| 
'DISTRIBUTOR FINAL PRICE EX GST'||'^'|| 
'DELL PRICE EX GST'||'^'|| 
'QTY REQUIRED'||'^'|| 
'CURRENCY'||'^'|| 
'LICENSE PACKAGE'||'^'|| 
'MSLICENSE'||'^'|| 
'MSSOFTWARE' 
From Dual; 

Select distinct SSR_REFNO||'^'|| 
SSR_STATUS||'^'|| 
SSR_APPLY_DATE||'^'|| 
TO_CHAR(SSR_MAN_DATE, 'DDMONRRRR HH24:MI:SS')||'^'|| 
TO_CHAR(SSR_ORT_DATE, 'DDMONRRRR HH24:MI:SS')||'^'|| 
TO_CHAR(SSR_GP_DATE, 'DDMONRRRR HH24:MI:SS')||'^'|| 
TO_CHAR(SSR_DIR_DATE, 'DDMONRRRR HH24:MI:SS')||'^'|| 
TO_CHAR(SSR_SCM_DATE, 'DDMONRRRR HH24:MI:SS')||'^'|| 
REPLACE(SSR_ITEM_NO, chr(10), '')||'^'|| 
REPLACE(SSR_ISMARTS_SKU, chr(10), '')||'^'|| 
REPLACE(SSR_MANUFACTURER_SKU, chr(10), '')||'^'|| 
REPLACE(SSR_COUNTRY, chr(10), '')||'^'|| 
REPLACE(SSR_DISTRIBUTOR, chr(10), '')||'^'|| 
REPLACE(SSR_MANF_STD_COST_EX_GST, chr(10), '')||'^'|| 
REPLACE(SSR_MANF_COST_EX_GST, chr(10), '')||'^'|| 
REPLACE(SSR_DELL_PRICE_EX_GST, chr(10), '')||'^'|| 
REPLACE(SSR_QTY_REQUIRED, chr(10), '')||'^'|| 
REPLACE(SSR_CURRENCY, chr(10), '')||'^'|| 
REPLACE(SSR_LICENSE_PACKAGE, chr(10), '')||'^'|| 
REPLACE(SSR_MSLICENSE, chr(10), '')||'^'|| 
REPLACE(SSR_MSSOFTWARE, chr(10), '') 
From SPOT_SNP_REPORt 
Where SSR_REFNO like 'FSPOT-%' and SSR_ITEM_NO <100000; 

SPOOL OFF 
exit; 
+1

這是否有幫助?:http://forums.oracle.com/forums/thread.jspa?threadID=339247 – 2010-11-02 10:17:27

回答

0

也許你正在????因爲你的文本編輯器不知道文本文件是UTF-8?

一個文本文件不包含有關它如何編碼的信息。 Youo應該指示你的文本編輯器應該將數據解釋爲UTF-8並確保它使用的是包含中文字符的字體(如DejaVu字體)

+0

實際上,即使您在其他文本編輯器中打開的數據僅作爲垃圾字符出現。在oracle中查看時的相同數據顯示中文字符,但是當我們使用批處理程序對其進行後臺處理時,它顯示的是垃圾字符。 – shaleen 2010-11-02 10:07:22

+0

請查找我的批處理程序和使用的SQL命令的代碼。 – shaleen 2010-11-02 10:08:23

0

這些字符是否在sql * plus輸出中正確顯示窗口?

也許你應該改變SQL *加字符編碼?註冊表參數SQLPLUS_FONT_CHARSETHKLM/Software/Oracle/Home0表示這一點。

8

每當客戶端程序(如sqlplus)連接到數據庫時,它都會告訴數據庫它使用的是什麼字符集。有些環境可能會有非常受限制的字符集,並使用像US7ASCII這樣的東西,所以他們不會得到任何可能會讓他們感到不安的東西。

正如您在以下示例中所看到的,查詢輸出的內容取決於客戶端的NLS_LANG設置。

C:\>set NLS_LANG=.US7ASCII 
C:\>sqlplus ???/[email protected] 

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Nov 3 09:31:32 2010 
> select chr(193) from dual; 

C 
- 
? 

> quit 

C:\>set NLS_LANG=.AL32UTF8 
C:\>sqlplus ???/[email protected] 

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Nov 3 09:31:49 2010 
> select chr(193) from dual; 

C 
- 
┴ 

如果您的客戶端是Windows,那麼請嘗試上述操作。如果是UNIX(ISH)平臺,嘗試

export NLS_LANG=.AL32UTF8 
0

看你喜歡當前配置:

% set | grep NLS 
    NLS_DATE_FORMAT=YYYY-MM-DD-HH24:MI 
    NLS_LANG=AMERICAN_AMERICA.AL32UTF8 

,包括在啓動相同的語句。您也可以simplfy你的spool腳本定義同樣的東西在腳本的開始,從而在輸出的每一列避免格式化日期的情況下:

alter session set NLS_LANG='.AL32UTF8' 
    alter session set nls_date_format='DDMONRRRR HH24:MI:SS' 

另外一個簡單的方法,把頭部,用「提示」,而不是select ... from dual:只要你想

prompt SPOT#^STATUS^APPLY DATE^MANAGER SIGNOFF^....^MSSOFTWARE 

剛剛寫下的標題。

相關問題