
技術
2023.3.30(Thu)
システム移行時に注意! 各DBのNULLの取り扱いまとめ
目次
こんにちは。池島です。
システム開発に欠かせないデータベースですが、各データベースにはデータの取り扱いに差異があります。今回は各データベースにおけるNULLと空文字の取り扱いについてご紹介します。
今回の検証環境
以下4つのデータベースについて比較していきます。
- PostgreSQL
- 15.1
- Oracle
- 19c
- MySQL
- 8.0.31
- SQL Server
- 2017
検証内容
次のようなテーブル:employeeを作成します。
name(varchar) | position(varchar) |
---|---|
ikejima | (null) |
yamada | |
saitou | chief |
下記SQLを各データベースで実行し、結果を確認します。
・IS NULLで判定
SELECT * FROM employee WHERE position IS NULL;
・空文字と等号で判定
SELECT * FROM employee WHERE position = '';
PostgreSQL
・IS NULLで判定
name(varchar) | position(varchar) |
---|---|
ikejima | (null) |
・空文字と等号で判定
name(varchar) | position(varchar) |
---|---|
yamada |
IS NULL判定では、positionがNullのデータが取得でき、空文字と等号の判定では、positionが空文字のデータが取得されていることが分かります。
Oracle
・IS NULLで判定
name(varchar) | position(varchar) |
---|---|
ikejima | (null) |
yamada |
・空文字と等号で判定
name(varchar) | position(varchar) |
---|---|
取得結果なし |
IS NULL判定では、positionがNullのデータと、空文字のデータが取得されました。空文字と等号の判定では、データは取得できませんでした。Oracleでは空文字がNULLとして取り扱われていることが分かります。
MySQL
・IS NULLで判定
name(varchar) | position(varchar) |
---|---|
ikejima | (null) |
・空文字と等号で判定
name(varchar) | position(varchar) |
---|---|
yamada |
PostgreSQLと同じ結果となりました。
SQL Server
・IS NULLで判定
name(varchar) | position(varchar) |
---|---|
ikejima | (null) |
・空文字と等号で判定
name(varchar) | position(varchar) |
---|---|
yamada |
PostgreSQLとMySQLと同じ結果になりました。
検証結果
結果をまとめると下記の通りになりました。
- PostgreSQL
- NULLと空文字を区別する
- OracleL
- 空文字はNULLとして判別される
- MySQL
- NULLと空文字を区別する
- SQL Server
- NULLと空文字を区別する
まとめ
いかがでしたでしょうか。
データベースによって仕様差異があることは、頭の片隅にあると役に立つことがあるかと思います。特にシステム移行やマイグレーションの際には注意したいですね。ではまた!
《関連記事》


ITエンジニアリング事業部 チーフ
Y.Ikejima
ライフスタイルを中心に、見て、やってみて、経験して、考えたことを発信します。
MOST VIEWED ARTICLES