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

MySQLにおける範囲外の数値の扱い方:SQLモードによる挙動の違いを解説

MySQLでは、カラムのデータ型で許容される範囲外の数値を挿入しようとした場合、その処理方法はSQLモードの設定によって異なります。本記事では、厳格モード(strict mode)が有効な場合と無効な場合のそれぞれの挙動について、具体例とともにわかりやすく解説します。

厳格SQLモードが有効な場合

厳格SQLモードが有効になっている場合、範囲外の値を挿入しようとすると、MySQLはエラーを返します。この場合、挿入処理の一部またはすべてが失敗します。

まず、TINYINT型とUNSIGNED TINYINT型の2つのカラムを持つテーブルを作成してみましょう。

mysql> Create table counting(Range1 Tinyint, Range2 Tinyint Unsigned);
Query OK, 0 rows affected (0.14 sec)

次のコマンドで、厳格SQLモードを有効にします。

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

この状態で範囲外の値を挿入しようとすると、MySQLはエラーを返し、挿入は失敗します。以下のクエリでその様子を確認できます。

mysql> Insert into Counting(Range1, Range2) Values(256,256);
ERROR 1264 (22003): Out of range value for column 'Range1' at row 1

mysql> Select * from counting;
Empty set (0.00 sec)

TINYINT型の最大値は127、UNSIGNED TINYINT型の最大値は255であるため、256という値はどちらのカラムにも収まりません。エラーが発生したため、テーブルには何も保存されていないことがわかります。

厳格SQLモードが無効な場合

厳格SQLモードが無効になっている場合、MySQLは範囲外の値をそのカラムのデータ型の適切な上限値(または下限値)に丸めて(クリップして)保存します。この際、クリッピングによる代入変換の結果として、警告(Warning)が表示されます。

実際に、厳格SQLモードを無効化した状態で同じ値を挿入してみると、MySQLは警告を表示しつつ、値を適切な端点に調整して保存します。

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

mysql> Insert Into Counting(Range1,Range2) values (256,256);
Query OK, 1 row affected, 2 warnings (0.02 sec)

mysql> Show Warnings;
+---------+------+-------------------------------------------------+
| Level   | Code | Message                                         |
+---------+------+-------------------------------------------------+
| Warning | 1264 | Out of range value for column 'Range1' at row 1 |
| Warning | 1264 | Out of range value for column 'Range2' at row 1 |
+---------+------+-------------------------------------------------+
2 rows in set (0.00 sec)

mysql> Select * from Counting;
+--------+--------+
| Range1 | Range2 |
+--------+--------+
| 127    | 255    |
+--------+--------+
1 row in set (0.00 sec)

このように、256という範囲外の値は、TINYINT型のカラムでは最大値の127に、UNSIGNED TINYINT型のカラムでは最大値の255に自動的に調整されて保存されます。

まとめ

MySQLにおける範囲外の数値の取り扱いは、SQLモードによって大きく異なります。

  • 厳格モード有効時: エラーを返し、挿入は失敗する
  • 厳格モード無効時: 値をデータ型の上限・下限に丸めて保存し、警告を表示する

意図しないデータの丸め込みを防ぎ、データの整合性を重視したい場合は、厳格モードを有効にしておくことをおすすめします。

  1. MySQLで範囲内の値を検索する方法|BETWEEN演算子の使い方を解説

    MySQLで特定の値が指定した範囲(開始値〜終了値)に含まれているかどうかを調べるには、BETWEEN演算子を使用します。この記事では、サンプルテーブルの作成から実際の検索クエリの実行まで、手順を追ってわかりやすく解説します。 1. サンプルテーブルの作成 まず、範囲の開始値(Start)と終了値(End)を格納するテーブルを作成しましょう。 mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> Start int, -&g

  2. MySQLで列の値をCSV形式で表示する方法|GROUP_CONCAT()の使い方を解説

    MySQLで列の値をCSV形式で表示するには?MySQLで列の値をCSV(カンマ区切り)形式で表示したい場合は、GROUP_CONCAT()関数を使用します。この関数を利用することで、複数行に分かれている値を1行のカンマ区切り文字列としてまとめて取得できます。ここでは、実際にテーブルを作成し、データを投入して、GROUP_CONCAT()の動作を確認していきましょう。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable786 ( StudentId int NOT NULL AUTO_INCREMENT PRIMA