11

NULL がデータベースにどのように格納されるのか知りたいです。

それは確かにデータベースサーバーに依存しますが、それについての一般的な考えを持ちたいと思います.


初挑戦:

サーバーが NULL 値のフィールドに未定義の値 (何でもかまいません) を入れたとします。

あなたは非常に幸運で、NULL値を取得できますか

...WHERE field = 'the undefined value (remember, could be anything...)'

2 回目の試行:

サーバーには、このフィールドが NULL であることを示すフラグまたはメタデータがどこかにありますか?

次に、サーバーはこのメタデータを読み取ってフィールドを検証する必要があります。

メタデータが NULL 値を示し、クエリに「field IS NULL」がない場合、レコードは無視されます。


簡単すぎるような…

4

5 に答える 5

10

MySql は 2 番目の方法を使用します。どの列が NULL であるかを示すために各行のデータと共にビットの配列 (列ごとに 1 つ) を格納し、そのフィールドのデータを空白のままにします。これは他のすべてのデータベースにも当てはまると確信しています。

最初の方法の問題は、データに選択した値が有効なデータとして表示されないということです。一部の値 (日付や浮動小数点数など) については、これが当てはまります。他のもの (整数など) の場合、これは false です。

于 2008-10-31T16:45:05.033 に答える
5

PostgreSQL では、列ごとに 1 ビットのオプションのビットマップを使用します (0 は null、1 は null ではありません)。ビットマップが存在しない場合、すべての列は null ではありません。

これは、データ自体のストレージとは完全に分離されていますが、行と同じページにあります (したがって、行とビットマップの両方が一緒に読み取られます)。

参考文献:

于 2008-10-31T16:55:49.800 に答える
2

サーバーは通常、マジック値ではなくメタ情報を使用します。そのため、フィールドが null かどうかを指定する場所が少しずれています。

-アダム

于 2008-10-31T16:44:16.500 に答える
1

NULLを示す特別な値の問題は、遅かれ早かれその特別な値が挿入されることです。たとえば、さまざまなデータベースサーバーの特別なNULLインジケーターを指定するテーブルに挿入されます

| DBServer     | SpecialValue |
+--------------+--------------+
| 'Oracle'     | 'Glyph'      |
| 'SQL Server' | 'Redmond'    |

;-)

于 2008-11-05T21:12:40.137 に答える
1

IBM Informix Dynamic Server は、NULL を示すために特別な値を使用します。たとえば、SMALLINT (16 ビット、符号付き) の有効な値の範囲は -32767..+32767 です。もう 1 つの値 -32768 は、NULL を示すために予約されています。INTEGER (4 バイト、符号付き) および BIGINT (8 バイト、符号付き) についても同様です。他の型については、他の特別な表現を使用します (たとえば、SQL FLOAT および SMALLFLOAT のすべてのビット 1 - それぞれ別名 C の double および float)。これは、余分なスペースを使用する必要がないことを意味します。

IBM DB2 for Linux、Unix、Windows は余分なバイトを使用してヌル インジケータを格納します。私の知る限り、ヌル可能フィールドごとに個別のバイトを使用しますが、その詳細については間違っている可能性があります。

そのため、ご指摘のとおり、DBMS によって仕組みが異なります。

于 2008-11-01T07:04:19.650 に答える