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

MySQLのNOT NULL列に空文字列を挿入した場合、データ型はどのような役割を果たすのか?

空文字列の挿入とデータ型の関係

NOT NULLとして宣言されたMySQLの列に空文字列('')を挿入する場合、結果セットにおけるその値の表現は列のデータ型によって異なります。これは、空文字列を挿入するという行為が、MySQLにとって「整数表現では INT の 0 に相当する値」を渡すことと同じだからです。

データ型がINTの場合:0として表示される

列のデータ型がINTEGER(INT)である場合、空文字列は整数の0にマッピングされます。そのため、SELECT文の結果セットには「0」が表示されます。

実行例

mysql> create table test(id int NOT NULL, Name Varchar(10));
Query OK, 0 rows affected (0.19 sec)

mysql> Insert into test(id, name) values('1', 'Gaurav'),('0','Rahul'),('','Aarav');
Query OK, 3 rows affected, 1 warning (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 1

mysql> Select * from test;
+----+--------+
| id | Name   |
+----+--------+
|  1 | Gaurav |
|  0 | Rahul  |
|  0 | Aarav  |
+----+--------+
3 rows in set (0.00 sec)

上記の例では、id列がINT型のため、空文字列を挿入した3行目のレコードには「0」が格納されていることが確認できます。

データ型がVARCHARの場合:空文字列のまま表示される

一方、列のデータ型がVARCHARなどの文字列型である場合、空文字列はそのまま空文字列として扱われます。そのため、結果セットには何も表示されません。

実行例

mysql> create table test123(id Varchar(10) NOT NULL, Name Varchar(10));
Query OK, 0 rows affected (0.19 sec)

mysql> Insert into test123(id, name) values('1', 'Gaurav'),('0','Rahul'),('','Aarav');
Query OK, 3 rows affected, 1 warning (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 1

mysql> Select * from test123;
+----+--------+
| id | Name   |
+----+--------+
|  1 | Gaurav |
|  0 | Rahul  |
|    | Aarav  |
+----+--------+
3 rows in set (0.00 sec)

こちらの例では、id列がVARCHAR型のため、空文字列は数値に変換されず、そのまま空の状態で保存されています。

まとめ

以上の例から、NOT NULL制約が付いたMySQLの列に空文字列を挿入する際、データ型が重要な役割を果たすことがわかります。数値型(INTなど)の列では空文字列は0に変換され、文字列型(VARCHARなど)の列では空文字列のまま保存されるという違いがあります。

補足として、sql_modeがSTRICT_TRANS_TABLES(厳密モード)に設定されている環境では、INT型の列に空文字列を挿入しようとすると警告ではなくエラーが発生し、挿入自体が失敗する点にも注意してください。意図しないデータ変換を防ぐためにも、アプリケーション側でNULLと空文字列を明確に区別して扱うことが推奨されます。

  1. MySQLのNOT NULL制約とは?空にできない列の定義方法とエラーの挙動を解説

    MySQLでは、列にNULL(空の値)を許可したくない場合、テーブル定義時にNOT NULL制約を指定します。NOT NULLが設定された列にNULLを挿入しようとすると、MySQLはエラーを返し、データの登録を拒否します。NOT NULL制約を持つテーブルの作成まず、Id列とLastName列をNOT NULLとして指定したテーブルを作成してみましょう。mysql> create table DemoTable1895 ( Id int NOT NULL, FirstName varchar(20), LastName varchar(20) NOT N

  2. MySQLでテーブルAとBを比較し、Bに存在しないデータをテーブルCに挿入する方法

    MySQL:テーブルAとBを比較し、Bに存在しないデータをCへ挿入する方法テーブルAのデータとテーブルBを比較し、Bに存在しないレコードだけをテーブルCに挿入したい場合は、LEFT JOIN(左外部結合)を使うのが最もシンプルで確実な方法です。ここでは、3つのテーブル(demo20=テーブルA、demo21=テーブルB、demo22=テーブルC)を使って、具体的な手順を順番に解説します。ステップ1:テーブルA(demo20)を作成するまず、比較元となる最初のテーブルを作成します。mysql> create table demo20 −> ( −> id