Пробелы, вызывающие проблему, в то время как выбирающие строки (Informix)

Всегда интересная проблема ПУСТОГО УКАЗАТЕЛЯ По сравнению с Пробелом управляет мной бит, сумасшедший теперь.

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

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

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

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

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

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

Может любой сообщать мне, где я неправ.

1
задан Jonathan Leffler 26 May 2017 в 01:41
поделиться

2 ответа

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

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

Типы SQL

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

Типы ESQL/C:

  • char - для данных CHAR; пробелы заполняются до полной длины с помощью терминатора NUL '\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 строк или около того).

2
ответ дан 3 September 2019 в 00:56
поделиться

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

0
ответ дан 3 September 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: