如何将Oracle数据库中的UTF-8格式数据转换为文本文件

时间:2010-11-02 09:41:13

标签: oracle

如何以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*.*    

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;

4 个答案:

答案 0 :(得分:10)

每当客户端程序(例如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

答案 1 :(得分:1)

看看你当前的配置如下:

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

并在开头包含相同的陈述。您还可以简化在脚本开头定义相同内容的假脱机脚本,从而避免在日期的情况下对输出中的每个列进行格式化:

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

另一个简单的方法是使用&#34;提示&#34;而不是select ... from dual

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

根据需要写下标题。

答案 2 :(得分:0)

也许你会得到????因为你的文本编辑器不知道文本文件是UTF-8吗?

文本文件不包含有关如何编码的信息。 Youo应该指示您的文本编辑器它应该将数据解释为UTF-8并确保它使用包含中文字符的字体(例如DejaVu字体)

答案 3 :(得分:0)

这个字符在sql * plus输出窗口中是否正确显示?

也许你应该改变sql * plus字符编码? SQLPLUS_FONT_CHARSET处的注册表参数HKLM/Software/Oracle/Home0表示这一点。