在获取行时导致问题的空白(Informix)

时间:2010-04-30 10:56:09

标签: null informix embedded-sql

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

我有两个代表两个表的ESQL / C结构。我要从中取出一排 光标中的一个表。使用此提取中的两个字段的值,我将检索 另一张桌子的一行。我知道第二次获取肯定会返回一行。

现在,第二个表可以有空值。空白,我的意思是像''这样的价值观。我卸货的时候 这些字符显示为'\'。但是在C程序中,我相信这些并没有得到提升。

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

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

不起作用。 gdb显示类似的东西 value =“\ 000”,''。但是我无法从C代码中验证这一点。

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

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

2 个答案:

答案 0 :(得分: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)值。这些应显示为字符串值,其中第一个字节在C代码中为NUL'\ 0' - 无论您使用哪种变量类型。 GDB的输出与此一致;第一个字节是'\ 0'(或'\ 000');其余的都无关紧要。

您可能想要查找指标变量;这些告诉您从DB中选择的特定值是否为NULL。

如果您仍有问题,请发布代码(最好是一个非常小的可编译程序,显示问题 - 最多50行左右;或代码的一小部分 - 比如20行左右)。

答案 1 :(得分:0)

在Informix-SE中,当我卸载具有NULL值的列的表时,卸载的列显示为带有两个管道符号“||”意味着该特定列没有值。