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モードによって大きく異なります。
- 厳格モード有効時: エラーを返し、挿入は失敗する
- 厳格モード無効時: 値をデータ型の上限・下限に丸めて保存し、警告を表示する
意図しないデータの丸め込みを防ぎ、データの整合性を重視したい場合は、厳格モードを有効にしておくことをおすすめします。
-
MySQLで範囲内の値を検索する方法|BETWEEN演算子の使い方を解説
MySQLで特定の値が指定した範囲(開始値〜終了値)に含まれているかどうかを調べるには、BETWEEN演算子を使用します。この記事では、サンプルテーブルの作成から実際の検索クエリの実行まで、手順を追ってわかりやすく解説します。 1. サンプルテーブルの作成 まず、範囲の開始値(Start)と終了値(End)を格納するテーブルを作成しましょう。 mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> Start int, -&g
-
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