1

NULL Vs Blank 一直很有趣的问题现在让我有点抓狂。

我有两个代表两个表的 ESQL/C 结构。我正在从游标中的一个表中获取一行。使用此提取中两个字段的值,我将从另一个表中检索一行。我事先知道第二次提取肯定会返回一行。

现在,第二个表可以有空白值。空白,我的意思是像''这样的值。当我进行卸载时,这些字符显示为“\”。但在 C 程序中,我相信这些并没有被获取。

或者,我无法查看这些值是否存在。假设我获取 char *value 中的值,

if (value[0] == '\0') 或 if (value[0] == ' ')

不起作用。gdb 显示类似 value = "\000", ' ' 的内容。但我无法从 C 代码中验证这一点。

我通过管道分隔文件手动加载表格。为了插入空白,我输入了 |\ |。

任何人都可以让我知道我错在哪里。

4

2 回答 2

2

您应该在一次操作中使用连接从两个表中收集数据。DBMS 非常擅长连接;当你在应用程序中手动加入时,你会减慢速度,通常是显着的。

数据类型很关键 - 并且在问题中未指定。

SQL 类型

  • VARCHAR(n) - 尾随空格很重要;零长度字符串不为 NULL。
  • CHAR(n) - 尾随空格由 DBMS 添加并可被应用程序删除。

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 行左右)。

于 2010-04-30T13:58:39.773 回答
0

在 Informix-SE 中,当我卸载包含具有 NULL 值的列的表时,卸载的列会出现两个管道符号“||” 表示该特定列没有值。

于 2010-07-05T23:48:06.327 回答