Как поместить данные формата UTF-8 из базы данных Oracle в текстовый файл - PullRequest
4 голосов
/ 02 ноября 2010

Как помещать в формате UTF-8 данные из базы данных Oracle в текстовый файл, в котором все символы UTF-8 выводятся правильно, например китайские символы.

Я пытаюсь буферизовать данные из базы данных Oracle с поддержкой UTF-8 и пытаюсь буферизовать те же данные в 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 ]

10 голосов
/ 03 ноября 2010

Каждый раз, когда клиентская программа (например, 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 голос
/ 18 октября 2016

Посмотрите на текущую конфигурацию, как:

   % 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'

Также простой способ размещения заголовков -используя "подсказку" вместо select ... from dual:

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

, просто запишите заголовок, как хотите.

0 голосов
/ 02 ноября 2010

Правильно ли отображаются эти символы в окне вывода sql * plus?

Может быть, вам следует изменить кодировку символов sql * plus?Параметр реестра SQLPLUS_FONT_CHARSET в HKLM/Software/Oracle/Home0 обозначает это.

0 голосов
/ 02 ноября 2010

Может быть, вы получаете ???? потому что ваш текстовый редактор не знает, что текстовый файл является UTF-8?

Текстовый файл не содержит информации о том, как он кодируется. Youo должен проинструктировать ваш текстовый редактор, что он должен интерпретировать данные как UTF-8 и убедиться, что он использует шрифт, содержащий китайские символы (например, шрифты DejaVu)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...