Миграция с сервера sql на проблемы с Oracle varchar - PullRequest
3 голосов
/ 31 октября 2011

Я столкнулся со странной проблемой, пытаясь перейти с сервера SQL на оракула.в одной из моих таблиц у меня есть столбец, определенный NVARCHAR(255), после прочтения я понял, что SQL-сервер считает символы, когда оракул подсчитывает байты.Поэтому я определил мою таблицу в oracle как VARCHAR(510) 255 * 2 = 510. Но при использовании sqlldr для загрузки данных из текстового файла с разделителями табуляции я получаю сообщение об ошибке, указывающее, что некоторые записи превысили длину этого столбца.после проверки на сервере sql с помощью:

SELECT MAX(DATALENGTH(column))
FROM table

я получаю, что максимальная длина данных составляет 510.

Я действительно использую Collationg Hebrew_CI_AS, хотя я не думаю, что это что-то меняет ....Я проверил в SQL Server также, если какая-либо из записей содержит TAB, но нет ... так что я думаю, это не поврежденные данные .... У кого-нибудь есть идея?

РЕДАКТИРОВАТЬ ПослеПри дальнейшей проверке я заметил, что проблема связана с файлом данных (в дополнение к проблеме, решаемой сообщением @Justin Cave.

Я изменил разделитель строк на '^', поскольку ни одна из моих данных не содержитэтот символ и '| ^ |' в качестве разделителя столбцов.

создает управляющий файл следующим образом:

load data
infile data.txt "str '^'"
badfile "data_BAD.txt"
discardfile "data_DSC.txt"
into table table
FIELDS TERMINATED BY '|^|' TRAILING NULLCOLS
(
     col1,
     col2,
     col3,
     col4,
     col5,
     col6
)

Проблема состоит в том, что мои данные содержат <CR> и sqlldr ожидает файл потокасуществует ошибка на <CR> !!!! Я не хочу изменять данные, так как это текстовые данные (сообщения об ошибках для примеров).

Ответы [ 2 ]

5 голосов
/ 31 октября 2011

Какой набор символов в вашей базе данных

SELECT parameter, value
  FROM v$nls_parameters
 WHERE parameter LIKE '%CHARACTERSET'

Предполагая, что ваш набор символов базы данных - AL32UTF8, каждому символу может потребоваться до 4 байтов памяти (хотя почти каждый полезный символ может быть представлен максимум 3 байтами памяти). Таким образом, вы можете объявить свой столбец как VARCHAR2(1020), чтобы убедиться, что у вас достаточно места.

Вы также можете просто использовать семантику длины символа. Если вы объявите свой столбец VARCHAR2(255 CHAR), вы выделите место для 255 символов независимо от количества места, которое требуется. Если вы измените параметр инициализации NLS_LENGTH_SEMANTICS со значения по умолчанию BYTE на CHAR, вы измените значение по умолчанию, чтобы VARCHAR2(255) интерпретировалось как VARCHAR2(255 CHAR), а не VARCHAR2(255 BYTE). Обратите внимание, что ограничение в 4000 байт для VARCHAR2 сохраняется, даже если вы используете семантику длины символа.

Если ваши данные содержат разрывы строк, вам нужен параметр TRAILING NULLCOLS? Это подразумевает, что иногда столбцы могут быть опущены в конце логической строки. Если вы объедините столбцы, которые могут быть опущены, со столбцами, которые содержат разрывы строк и данные, которые не заключены хотя бы в необязательный символ вложения, для меня не очевидно, как вы начнете определять, где закончилась логическая строка и где она началась. Если вам на самом деле не нужен параметр TRAILING NULLCOLS, вы можете использовать параметр CONTINUEIF для объединения нескольких физических строк в одну логическую строку. Если вы можете изменить формат файла данных, я настоятельно рекомендую добавить дополнительный символ вложения.

0 голосов
/ 31 октября 2011

Количество байтов, используемых полем NVARCHAR, в два раза больше количества символов плюс два (см. http://msdn.microsoft.com/en-us/library/ms186939.aspx),, поэтому, если вы сделаете свое поле VARCHAR 512, вы можетеХорошо. Есть также некоторые признаки того, что некоторые наборы символов используют 4 байта на символ, но я не нашел никаких признаков того, что иврит является одним из этих наборов символов.

...