MySQLではNULLと空文字列どちらを挿入すべき?違いと使い分けを実例で解説
InnoDBにおいて、NULLは空文字列('')よりも少ないストレージ容量で済みます。また、NULLの長さは「不定(NULL)」として扱われる一方、空文字列の長さは0です。本記事では、実際にテーブルを作成してデータを挿入し、COUNT関数の挙動の違いを通じて両者の特徴を検証していきます。
検証用テーブルの作成
まず、CREATE文を使って検証用のテーブルを作成します。
mysql> CREATE table DemoEmptyAndNULL
-> (
-> Message varchar(100)
-> );
Query OK, 0 rows affected (0.49 sec)
空文字列を挿入した場合のCOUNT()の挙動
テーブルの作成が完了したら、INSERT文で半角スペース(空文字列)を含むレコードを挿入します。
mysql> INSERT into DemoEmptyAndNULL values(' ');
Query OK, 1 row affected (0.17 sec)SELECT文ですべてのレコードを確認してみましょう。
mysql> SELECT * from DemoEmptyAndNULL;
クエリを実行すると、次のような結果が得られます。
+---------+
| Message |
+---------+
| |
+---------+
1 row in set (0.00 sec)
続いて、組み込み関数COUNT()を使って空文字列がどのように扱われるかを確認します。基本の構文は以下の通りです。
select count(column_name) from yourTableName;
この構文を実際のテーブルに対して実行します。
mysql> select count(message) from DemoEmptyAndNULL;
実行結果は以下のようになります。
+----------------+
| count(message) |
+----------------+
| 1 |
+----------------+
1 row in set (0.06 sec)
この結果から、空文字列は「値が存在する」ものとしてカウントされ、結果は1になります。COUNT(カラム名)はNULL以外の値を数える関数であるため、空文字列も有効な値として扱われる点が重要です。
NULLを挿入した場合のCOUNT()の挙動
次に、NULLの場合の挙動を確認します。まずDELETE文で先ほど挿入したレコードを削除します。
mysql> delete from DemoEmptyAndNULL where message=' ';
Query OK, 1 row affected (0.19 sec)
テーブルが空になったことをSELECT文で確認しておきましょう。
mysql> SELECT * from DemoEmptyAndNULL;
Empty set (0.00 sec)
続いて、値を指定せずにINSERT文を実行し、NULLのレコードを挿入します。
mysql> INSERT into DemoEmptyAndNULL values();
Query OK, 1 row affected (0.18 sec)
SELECT文でレコードを表示すると、次の結果が得られます。
+---------+
| Message |
+---------+
| NULL |
+---------+
1 row in set (0.00 sec)
これでテーブルにはNULL値を持つレコードが1件だけ存在する状態になりました。同じようにCOUNT()を実行してみます。
mysql> select count(message) from DemoEmptyAndNULL;
実行結果は以下の通りです。
+----------------+
| count(message) |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)
この出力が示すように、NULL値はCOUNT()の対象外となり、結果は0になります。つまり、NULLは「値が存在しない」状態として処理されるのです。
検証に使用したMySQLのバージョン
参考までに、今回の検証で使用したMySQLのバージョンを確認しておきます。
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.12 |
+-----------+
1 row in set (0.06 sec)
結論:NULLと空文字列の使い分けのポイント
検証結果をまとめると、以下のようになります。
- ストレージ効率: InnoDBではNULLの方が空文字列よりも少ない容量で済みます。
- COUNT()の挙動: 空文字列はカウントされますが、NULLはカウントされません。集計処理を行う場合はこの違いが結果に大きく影響します。
- 例外の発生: NULLに対してCOUNT()を実行しても例外は発生せず、安全に扱えます。
一般的には、「値が未定・不明」という意味を持たせたい場合はNULL、「空だという明確な値」を表したい場合は空文字列を使い分けるのが推奨されます。NULLを許可すると、NOT NULL制約なしのカラムではインデックスやクエリの最適化に余計な考慮が必要になる場面があり、意図しない集計結果につながることもあります。一方で、NULLはCOUNT()などの集計関数でも例外を起こさず自然に除外されるため、扱い方を理解すれば柔軟なデータ設計が可能です。アプリケーション側の仕様と集計要件に合わせて、適切な方を選択しましょう。
-
WhatsApp vs Telegram 徹底比較|どちらを選ぶべきか徹底解説
通信技術の進化により、数多くのインスタントメッセンジャーアプリが登場しました。その中でも特に人気が高いのが「WhatsApp」と「Telegram」ですが、この2つのどちらを選ぶべきか迷う方も多いのではないでしょうか。本記事では、両アプリの共通点と相違点をセキュリティやプライバシー機能などのさまざまな観点から詳しく解説し、個人利用にもビジネス利用にも最適なメッセンジャーの選び方をご紹介します。 Part 1:TelegramとWhatsAppの基本情報 Telegramとは Telegramは2013年、ニコライ・ドゥロフとパーヴェル・ドゥロフの兄弟によって開発されました。二人は、経営していた
-
Xbox One XとXbox One S徹底比較:どちらを選ぶべきか?
2017年11月8日、Microsoftは待望の史上最強ゲーム機「Xbox One X」をついに発売しました。これに合わせて、Xbox One Sの価格も値下げされています。しかし、両機種ともスタイリッシュなデザインで4Kコンテンツに対応し、名前もよく似ています。では、なぜ価格に差があるのでしょうか?どちらが優れており、One Xはその価格に見合う価値があるのか気になるところです。本記事では、両コンソールの主な機能を比較しながら、その共通点と違いを詳しく解説します。両コンソールの共通機能まずは、Xbox One XとXbox One Sに共通する機能から見ていきましょう。USBポート最初の共通