如何将UTF-8格式的数据从Oracle数据库转换为文本文件,所有UTF-8字符都正确输出,例如中文字符.
我试图从启用了UTF-8的Oracle数据库假脱机数据并尝试将相同的数据假脱机到txt或cvs.而不是我得到的汉字????.
我知道这个问题早先被问过,但没有给出答案,因此再次重新提出这个问题.
批量程序:
sqlplus snprn/SpotProd_07@SPOTDEV_VM.WORLD @C:\BatchJob\SPOTReport\spotreport.sql rem sqlplus snprn/SpotProd_07@lprodspot @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*.*
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,'')||'^'|| REPLACE(SSR_MANUFACTURER_SKU,'')||'^'|| REPLACE(SSR_COUNTRY,'')||'^'|| REPLACE(SSR_DISTRIBUTOR,'')||'^'|| REPLACE(SSR_MANF_STD_COST_EX_GST,'')||'^'|| REPLACE(SSR_MANF_COST_EX_GST,'')||'^'|| REPLACE(SSR_DELL_PRICE_EX_GST,'')||'^'|| REPLACE(SSR_QTY_required,'')||'^'|| REPLACE(SSR_CURRENCY,'')||'^'|| REPLACE(SSR_LICENSE_PACKAGE,'')||'^'|| REPLACE(SSR_MSLICENSE,'')||'^'|| REPLACE(SSR_MSSOFTWARE,'') From SPOT_SNP_REPORt Where SSR_REFNO like 'FSPOT-%' and SSR_ITEM_NO <100000; SPOOL OFF exit;
解决方法
每当客户端程序(例如sqlplus)连接到数据库时,它就会告诉数据库它正在使用哪些字符集.某些环境可能具有非常有限的字符集并且使用类似US7ASCII的东西,因此它们不会得到任何可能使它们烦恼的东西.
正如您在以下示例中所看到的,查询输出的内容取决于客户端的NLS_LANG设置.
C:\>set NLS_LANG=.US7ASCII C:\>sqlplus ???/???@xe 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 ???/???@xe 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