Пробелы, вызывающие проблемы при извлечении строк (Informix) - PullRequest
1 голос
/ 30 апреля 2010

Всегда интересный выпуск NULL Vs Blank сводит меня с ума.

У меня есть две структуры ESQL / C, которые представляют две таблицы. Я собираю ряд из одна таблица в курсоре. Используя значения двух полей из этой выборки, я получу строка из другой таблицы. Я знаю, перед этим вторая выборка обязательно вернет одну строку.

Теперь вторая таблица может иметь пустые значения. Под пустым я подразумеваю такие значения, как ''. Когда я делаю разгрузку эти символы отображаются как '\'. Но я считаю, что в рамках программы на С их нельзя получить.

Кроме того, я не могу увидеть, присутствуют ли эти значения. Предполагая, что я получаю значения в значение char *,

if (значение [0] == '\ 0') или if (значение [0] == '')

не работает. GDB показывает что-то вроде значение = "\ 000", ''. Но я не могу проверить это из кода C.

Я вручную загрузил таблицу через файл с разделителями канала. Для вставки бланка я набрал | \ |.

Может кто-нибудь, пожалуйста, дайте мне знать, где я не прав.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

Вы должны использовать объединение для сбора данных из двух таблиц за одну операцию. СУБД очень хорошо справляются с объединениями; когда вы выполняете соединения вручную в приложении, вы замедляете работу, как правило, резко.

Типы данных являются критическими и не указаны в вопросе.

Типы SQL

  • VARCHAR (n) - конечные пробелы значимы; строка нулевой длины не равна NULL.
  • CHAR (n) - конечные пробелы добавляются СУБД и могут быть удалены приложениями.

ESQL / C Типы:

  • char - для данных CHAR; пустой пробел дополняется до нуля символом '\ 0'.
  • fixchar - для данных CHAR; заготовка дополняется до полной длины без терминатора NUL '\ 0'.
  • varchar - для данных VARCHAR; не заполнено пробелом.
  • Также можно использовать указатели на эти типы, что усложняет ситуацию (компилятор не знает, насколько велика область, на которую указывает указатель).

Вы также упомянули использование '\' для загрузки данных. Это специальная запись, используемая с ненулевыми полями VARCHAR нулевой длины для указания этого значения; пустое поле указывает значение NULL в формате выгрузки. (На диске пустой ненулевой VARCHAR занимает один байт, значение 0x00 для длины ноль; NULL VARCHAR занимает два байта, значения 0x01 0x00 для длины 1 и значение NULL (или NUL).)

Судя по тому, что вы говорите, у вас, возможно, есть пустые (но не NULL) значения VARCHAR (n) во второй таблице. Они должны отображаться как строковые значения, где первый байт равен NUL '\ 0' в вашем C-коде - независимо от того, какой тип переменной вы используете. Вывод из GDB соответствует этому; первый байт равен «\ 0» (или «\ 000»); остальное не имеет значения.

Возможно, вы захотите посмотреть переменные индикатора; они сообщают вам, является ли конкретное значение, выбранное в БД, ПУСТО (NULL) или нет.

Если у вас все еще есть проблемы, опубликуйте код (желательно очень небольшую скомпилируемую программу, которая показывает проблему - скажем, до 50 строк или около того; или небольшой фрагмент кода - скажем, 20 строк или около того).

0 голосов
/ 06 июля 2010

В Informix-SE, когда я выгружаю таблицу со столбцами, имеющими значения NULL, выгруженные столбцы появляются с двумя символами канала "||" что означает отсутствие значения для этого конкретного столбца.

...