1

NULL Vs Blank の常に興味深い問題は、今私を少し夢中にさせています。

2 つのテーブルを表す 2 つの ESQL/C 構造があります。カーソル内の 1 つのテーブルから行をフェッチしています。このフェッチからの 2 つのフィールドの値を使用して、別のテーブルから行を取得します。2回目のフェッチで確実に1行が返されることは事前にわかっています。

これで、2 番目のテーブルに空白の値を含めることができます。空白とは、「」のような値を意味します。アンロードすると、これらの文字が「\」として表示されます。しかし、C プログラム内では、これらは取得されていないと思います。

または、これらの値が存在するかどうかを確認できません。char *value の値をフェッチすると仮定すると、

if (値[0] == '\0') または if (値[0] == ' ')

動作しません。gdb は value = "\000", ' ' のようなものを示します。しかし、C コードからこれを確認することはできません。

パイプ区切りファイルを使用してテーブルを手動でロードしました。空白を挿入するために、|\ | と入力しました。

誰でも私が間違っているところを教えてください。

4

2 に答える 2

2

1回の操作で2つのテーブルからデータを収集するには、結合を使用する必要があります。DBMSは結合を行うのに非常に優れています。アプリケーションで手動で結合を行うと、通常は劇的に速度が低下します。

データ型は重要であり、質問では指定されていません。

SQLタイプ

  • VARCHAR(n)-末尾の空白は重要です。長さゼロの文字列はNULLではありません。
  • CHAR(n)-末尾の空白はDBMSによって追加され、アプリケーションによって削除できます。

ESQL / Cタイプ:

  • char-CHARデータの場合。NUL'\0'ターミネータで完全な長さまで空白が埋め込まれます。
  • fixchar-CHARデータの場合。NUL'\0'ターミネータなしで完全な長さに空白が埋め込まれます。
  • varchar-VARCHARデータの場合。空白ではありません。
  • これらの型へのポインターも使用でき、問題がさらに複雑になります(コンパイラーは、ポインターが指すスペースの大きさを認識していません)。

\また、' 'を使用してデータをロードすることにも言及しています。これは、その値を示すために長さがゼロでないVARCHARフィールドで使用される特別な表記法です。空のフィールドは、アンロード形式のNULL値を示します。(ディスク上では、空の非ヌルVARCHARが1バイトを占め、長さがゼロの場合は値0x00、NULL VARCHARは2バイトを占め、長さが1の場合は値0x01 0x00、NULL(またはNUL)値)。

あなたの言うことから判断すると、2番目のテーブルには空の(しかしNULLではない)VARCHAR(n)値がある可能性があります。これらは、使用する変数タイプに関係なく、Cコードの最初のバイトがNUL'\0'である文字列値として表示されるはずです。GDBからの出力はそれと一致しています。最初のバイトは'\0'(または'\ 000')です。残りは無関係です。

インジケーター変数を検索することをお勧めします。これらは、DBから選択された特定の値がNULLであるかどうかを示します。

それでも問題が解決しない場合は、コードを投稿してください(できれば、問題を示す非常に小さなコンパイル可能なプログラム(たとえば、最大50行程度)またはコードの小さな断片(たとえば、20行程度))。

于 2010-04-30T13:58:39.773 に答える
0

Informix-SE で、NULL 値を持つ列を含むテーブルをアンロードすると、アンロードされた列に 2 つのパイプ記号 "||" が表示されます。その特定の列に値がないことを意味します。

于 2010-07-05T23:48:06.327 に答える