MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのENUM型における空の値とNULLの挙動をわかりやすく解説

MySQLでは、ENUM型(列挙型)のカラムに対して「空の値」と「NULL」は異なる扱いを受けます。本記事では、それぞれの挙動と設定方法について、具体例を交えて解説します。

ENUM型に空の値(空文字列)を挿入する条件

MySQLがENUM型のカラムに空の値を受け入れるのは、SQLモードが TRADITIONALSTRICT_TRANS_TABLESSTRICT_ALL_TABLES のいずれにも設定されていない場合のみです。これらの厳格なモードが有効になっていると、MySQLは空の値を受け入れず、エラーを発生させます。

また、ENUMの各値には内部的にインデックス番号が割り当てられており、空の値には 0 というインデックス値が対応します。

例:厳格モードで空文字列を挿入した場合

mysql> SET SQL_MODE = 'Traditional';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO result(id, name, grade) VALUES(100, 'Raman', '');
ERROR 1265 (01000): Data truncated for column 'Grade' at row 1

Traditional モードが有効な状態では、ENUMに定義されていない空文字列を挿入しようとしたため、ERROR 1265(データ切り詰めエラー)が発生しています。

例:SQLモードを解除して空文字列を挿入した場合

SQLモードを空に設定し直すと、空文字列を挿入できるようになります。

mysql> SET SQL_MODE = '';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO result(id, name, grade) VALUES(100, 'Raman', '');
Query OK, 1 row affected, 1 warning (0.04 sec)

mysql> SELECT * FROM result;
+-----+-------+-------+
| Id  | Name  | Grade |
+-----+-------+-------+
| 100 | Raman |       |
+-----+-------+-------+
1 row in set (0.00 sec)

このように、厳格モードが無効な環境では空文字列の挿入自体は成功しますが、警告(warning)が出力される点には注意が必要です。

ENUM型にNULLを挿入する条件

MySQLがENUM型のカラムにNULL値を受け入れるのは、カラム定義時に NOT NULL を指定していない場合のみです。NULLのインデックス値は NULL であり、空の値に対応する 0 とは明確に区別されます。

例:NULL値の挿入

mysql> INSERT INTO result(id, name, grade) VALUES(101, 'Rahul', NULL);
Query OK, 1 row affected (0.04 sec)

上記のクエリは、ENUMカラムの宣言時に NOT NULL を指定していないため、問題なくNULLを挿入できます。

mysql> SELECT * FROM result;
+-----+-------+-------+
| Id  | Name  | Grade |
+-----+-------+-------+
| 100 | Raman |       |
| 101 | Rahul | NULL  |
+-----+-------+-------+
2 rows in set (0.00 sec)

まとめ:空の値とNULLの違い

項目空の値('')NULL
挿入できる条件厳格なSQLモードが無効であることカラムにNOT NULLが指定されていないこと
インデックス値0NULL
意味どの列挙値にも一致しない空文字列として保存される値が不明・未設定であることを示す

ENUM型を設計する際は、アプリケーションの要件に応じてSQLモードとNOT NULL制約を適切に組み合わせることで、意図しないデータの混入を防ぐことができます。

  1. MySQLでNULL値を除外して残りの値だけを表示する方法

    MySQLでは、IS NOT NULL演算子を使うことで、NULL値を除外し、実際に値が存在するレコードだけを取得・表示できます。本記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。 1. テーブルを作成する まず、学生名とスコアを格納するテーブルを作成します。 mysql> create table DemoTable1458     -> (     -> StudentName varchar(20),     ->

  2. MySQLでNULL値を1として表示・更新する方法

    MySQLでは、テーブル内のNULL値を別の値(たとえば「1」)に置き換えて扱いたい場面があります。この記事では、IFNULL関数とUPDATE文を組み合わせて、NULL値を1に変換する具体的な手順をサンプルコード付きで解説します。 1. サンプルテーブルを作成する まず、動作確認用のテーブルを作成します。 mysql> create table DemoTable1963 ( Counter int ); Query OK, 0 rows affected (0.00 sec) 2. レコードを挿入する INSERT文を使って、NULLを含む複数のレコードを