Загрузка символов Unicode с Oracle SQL Loader (sqlldr) приводит к вопросительным знакам - PullRequest
2 голосов
/ 06 декабря 2011

Я пытаюсь загрузить локализованные строки из CSV-файла Unicode (в кодировке UTF8) с помощью SQL Loader в базу данных Oracle. Я перепробовал все виды комбинаций, но, похоже, ничто не дает мне результата, который я ищу, - чтобы специальные греческие символы, такие как (Δ), не конвертировались в Î »или ¿.

Определение моей таблицы выглядит так:

CREATE TABLE "GLOBALIZATIONRESOURCE"
(
    "RESOURCETYPE" VARCHAR2(255 CHAR) NOT NULL ENABLE,
    "CULTURE"      VARCHAR2(20 CHAR) NOT NULL ENABLE,
    "KEY"          VARCHAR2(128 CHAR) NOT NULL ENABLE,
    "VALUE"        VARCHAR2(2048 CHAR),
    "DESCRIPTION"  VARCHAR2(512 CHAR),
    CONSTRAINT "PK_GLOBALIZATIONRESOURCE" PRIMARY KEY ("RESOURCETYPE","CULTURE","KEY") USING INDEX TABLESPACE REPSPACE_IX ENABLE
)
TABLESPACE REPSPACE; 

Я попробовал следующие конфигурации в моем управляющем файле (и фактически каждую перестановку, о которой я мог думать)

load data
TRUNCATE
INTO TABLE "GLOBALIZATIONRESOURCE"
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(   
    "RESOURCETYPE" CHAR(255), 
    "CULTURE" CHAR(20), 
    "KEY" CHAR(128), 
    "VALUE" CHAR(2048), 
    "DESCRIPTION" CHAR(512)
)

load data
CHARACTERSET UTF8
TRUNCATE
INTO TABLE "GLOBALIZATIONRESOURCE"
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(   
    "RESOURCETYPE" CHAR(255), 
    "CULTURE" CHAR(20), 
    "KEY" CHAR(128), 
    "VALUE" CHAR(2048), 
    "DESCRIPTION" CHAR(512)
)

load data
CHARACTERSET UTF16
TRUNCATE
INTO TABLE "GLOBALIZATIONRESOURCE"
FIELDS TERMINATED BY X'002c' OPTIONALLY ENCLOSED BY X'0022'
TRAILING NULLCOLS
(   
    "RESOURCETYPE" CHAR(255), 
    "CULTURE" CHAR(20), 
    "KEY" CHAR(128), 
    "VALUE" CHAR(2048), 
    "DESCRIPTION" CHAR(512)
)

При первых двух параметрах символы Юникода не кодируются, а отображаются как перевернутые знаки вопроса.

Если я выберу последний вариант, UTF16, то получаю следующую ошибку, даже если все мои данные в моих полях намного короче указанной длины.

Field in data file exceeds maximum length

Кажется, что каждая возможная комбинация конфигураций файла ctl (даже установка порядка байтов на маленький и большой) не работает правильно. Может ли кто-нибудь привести пример конфигурации (структура таблицы и файл CTL), которая правильно загружает данные Unicode из CSV? Любая помощь будет принята с благодарностью.

Примечание: я уже был на http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_concepts.htm, http://docs.oracle.com/cd/B10501_01/server.920/a96652/ch10.htm и http://docs.oracle.com/cd/B10501_01/server.920/a96652/ch10.htm.

Ответы [ 4 ]

2 голосов
/ 28 декабря 2016

У вас две проблемы;

  1. Набор символов.

Ответ: Вы можете решить эту проблему, найдя свой текстовый набор символов (большую часть времени Notepad ++ может сделать это.). После нахождения набора символов вы должны найти sqlldr соответствующее имя набора символов. Итак, вы можете найти эту информацию по ссылке https://docs.oracle.com/cd/B10501_01/server.920/a96529/appa.htm#975313 После всего этого вы должны решить проблему с набором символов.

  1. В отличие от вашей фактической длины данных, sqlldr говорит, что Field in data file exceeds maximum length.

Ответ: Вы можете решить эту проблему, добавив CHAR(4000) (или какова фактическая длина) в проблемный столбец. В моем случае проблемным столбцом является столбец «E». Пример ниже. В моем случае я решил свою проблему таким образом, надежда помогает. LOAD DATA CHARACTERSET UTF8 -- <strong>This line is comment</strong> -- Turkish charset (for ÜĞİŞ etc.) -- CHARACTERSET WE8ISO8859P9 -- Character list is here. -- <a href="https://docs.oracle.com/cd/B10501_01/server.920/a96529/appa.htm#975313" rel="nofollow noreferrer">https://docs.oracle.com/cd/B10501_01/server.920/a96529/appa.htm#975313</a> INFILE 'data.txt' "STR '~|~\n'" TRUNCATE INTO TABLE SILTAB FIELDS TERMINATED BY '#' TRAILING NULLCOLS ( a, b, c, d, e CHAR(4000) )

1 голос
/ 03 апреля 2015

Не используйте MS Office для сохранения электронной таблицы в формате Unicode .csv.Вместо этого используйте OpenOffice для сохранения в файл unicode-UTF8 .csv.Затем в файле управления загрузчиком добавьте «CHARACTERSET UTF8», запустите Oracle SQL * Loader, это даст мне правильные результаты

1 голос
/ 08 декабря 2011

Вы должны убедиться, что следующие наборы символов совпадают:

  1. набор символов дБ
  2. набор символов файла дампа
  3. клиент, с которого выполняется импорт (NLS_LANG)

Если набор символов на стороне клиента отличается, oracle попытается выполнить преобразование символов в собственный набор символов db, и это не всегда может обеспечить желаемый результат.

0 голосов
/ 29 апреля 2016

Существует ряд кодировок наборов символов, которые вы можете использовать в контрольном файле при загрузке данных из загрузчика sql.

Для греческих персонажей я считаю, что западноевропейский набор символов должен помочь.

LOAD DATA
CHARACTERSET WE8ISO8859P1

или в случае файлов ввода MS word со смарт-символами попробуйте в контрольном файле

LOAD DATA
CHARACTERSET WE8MSWIN1252
...