MySQLのENUM型に無効な値を挿入するとどうなる?空文字列とエラーの挙動を解説
ENUMに無効な値を挿入したときのMySQLの動作
MySQLのENUM型カラムに、許可された列挙値のリストに含まれない無効な値を挿入した場合、その挙動はstrict SQLモードの設定によって異なります。
- strict SQLモードが無効な場合: エラーは発生せず、代わりに空文字列('')が挿入されます。
- strict SQLモードが有効な場合: 無効な値を挿入しようとすると、エラーがスローされます。
例1:strict SQLモードが無効な場合
strict SQLモードを無効にした状態で、ENUMカラムに無効な文字列を挿入してみましょう。
mysql> Insert into result(id, name, grade) values(100, 'Gaurav','abcd');
Query OK, 1 row affected, 1 warning (0.03 sec)
mysql> Select * from result;
+-----+--------+-------+
| Id | Name | Grade |
+-----+--------+-------+
| 100 | Gaurav | |
+-----+--------+-------+
1 row in set (0.00 sec)
上記のクエリ結果から、MySQLが無効な文字列の代わりに空文字列を挿入し、エラーはスローされていないことがわかります。なお、実行時には「1 warning」という警告が表示されている点にも注目してください。
挿入された値が空文字列であることの確認
次に、以下のクエリでENUMカラムのインデックス番号を取得してみます。
mysql> Select Grade + 0 from result;
+-----------+
| Grade + 0 |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)
結果は0でした。ENUMのインデックス値は通常1から始まりますが、空文字列のインデックス値は常に0として扱われるため、この結果はMySQLが空文字列を挿入したことの確かな証拠となります。
例2:strict SQLモードが有効な場合
次に、以下のようにSQL strictモードを有効にしてから、同じく無効な文字列を挿入してみます。
mysql> Set SQL_MODE = 'Traditional';
Query OK, 0 rows affected (0.00 sec)
mysql> Insert into result(id, name, grade) values(101, 'Saurabh','abcd');
ERROR 1265 (01000): Data truncated for column 'Grade' at row 1
今度はMySQLがエラー1265(Data truncated)をスローし、無効な値の挿入が拒否されました。
まとめ
ENUM型への無効な値の挿入に対するMySQLの挙動は、SQLモードの設定に依存します。本番環境ではデータの整合性を保つために、strict SQLモードを有効にしておくことを推奨します。無効なデータが黙って空文字列として登録されるのを防ぎ、問題を早期に検出できるようになります。
-
Javaを使ってDATE型の値をMySQLカラムに挿入する方法【PreparedStatement活用】
はじめに JavaからMySQLのDATE型カラムに日付データを挿入したい場合、PreparedStatementを使用するのが最も安全で推奨される方法です。SQLインジェクション対策にもなり、日付型の変換もスムーズに行えます。 本記事では、Javaプログラムから現在の日付をMySQLテーブルに挿入する手順を、サンプルコード付きでわかりやすく解説します。 1. サンプルテーブルの作成 まず、DATE型のカラム「ArrivalDate」を含むテーブルを作成します。以下はMySQLでの作成例です。 mysql> create table DemoTable( PassengerId
-
JavaでMySQLデータベースにNULL値を挿入する方法
JavaからデータベースにNULL値を挿入したいケースはよくあります。その場合、PreparedStatementのsetNull()メソッドを使用します。基本的な構文は以下の通りです。ps.setNull(インデックス番号, Types.NULL);この記事では、実際にサンプルを通してNULL値の挿入手順を解説します。1. テーブルの作成まず、MySQLでテスト用のテーブルを作成します。mysql> create table DemoTable1893 ( FirstName varchar(20) ); Query OK, 0 rows affected (0