Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  範囲外およびオーバーフローの処理

11.2.6 範囲外およびオーバーフローの処理

MySQL が、カラムデータ型の許可できる範囲外にある数値カラムに値を格納すると、結果は、その時点で有効な SQL モードによって異なります。

  • 厳密な SQL モードが有効な場合、SQL 標準に従って、MySQL は範囲外の値を拒否してエラーを表示し、挿入は失敗します。

  • 制限の強いモードが有効になっていない場合、MySQL は、範囲の適切な終点に値を切り落とし、その結果の値を代わりに格納します。

    範囲外の値が整数カラムに割り当てられると、MySQL は、カラムデータ型の範囲の対応する終点を表す値を格納します。TINYINT または TINYINT UNSIGNED カラムに 256 を格納すると、MySQL はそれぞれに 127 または 255 を格納します。

    浮動小数点または固定小数点カラムに、指定された (またはデフォルトの) 精度とスケールによって暗示された範囲を超えた値が割り当てられると、MySQL はその範囲の対応する終点を表す値を格納します。

MySQL が厳密モードで動作していないときの切り落としのために起きるカラム割り当て変換は、ALTER TABLELOAD DATA INFILEUPDATE、および複数行の INSERT ステートメントに対する警告としてレポートされます。厳密モードでは、これらのステートメントは失敗し、テーブルがトランザクションテーブルかどうかやほかの要因に応じて、一部またはすべての値が挿入または変更されません。詳細は、セクション5.1.7「サーバー SQL モード」を参照してください。

MySQL 5.6 では、数値式評価中のオーバーフローはエラーになります。たとえば、符号付きの BIGINT の最大値は 9223372036854775807 なので、次の式ではエラーが発生します。

mysql> SELECT 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'

この場合に演算を成功させるには、値を符号なしに変換します。

mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;
+-------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) + 1 |
+-------------------------------------------+
|                       9223372036854775808 |
+-------------------------------------------+

オーバーフローが起きるかどうかはオペランドの範囲に応じて異なります。したがって、前述の式を処理するもう 1 つの方法として、DECIMAL 値に整数より大きな範囲があるので正確な値の演算を使用します。

mysql> SELECT 9223372036854775807.0 + 1;
+---------------------------+
| 9223372036854775807.0 + 1 |
+---------------------------+
|     9223372036854775808.0 |
+---------------------------+

一方が UNSIGNED 型のときに 2 つの整数値の間で減算を行うと、デフォルトでは符号なしの結果が生成されます。MySQL 5.5.5 より前では、それ以外では結果が負になっていた場合、最大の整数値になります。

mysql> SET sql_mode = '';
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|    18446744073709551615 |
+-------------------------+

MySQL 5.5.5 以降では、それ以外では結果が負になっていた場合、エラーになります。

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

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'

NO_UNSIGNED_SUBTRACTION SQL モードが有効な場合は、結果は負になります。

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|                      -1 |
+-------------------------+

このような演算の結果を使用して UNSIGNED 整数カラムが更新されると、結果はそのカラム型の最大値に切り落とされます。NO_UNSIGNED_SUBTRACTION が有効になっている場合は、0 に切り落とされます。厳密な SQL モードが有効になっている場合は、エラーが発生し、カラムは変わりません。


User Comments
Sign Up Login You must be logged in to post a comment.