MySQLのNO_UNSIGNED_SUBTRACTION SQLモードとは?符号なし整数減算のオーバーフローエラーを回避する方法
NO_UNSIGNED_SUBTRACTION SQLモードの概要
MySQLでは、SQLの厳格モード(strict mode)が有効になっている場合、UNSIGNED型(符号なし整数型)の値を含む整数同士の減算は、デフォルトで符号なしの結果を返します。しかし、計算結果が負の数になってしまうと、MySQLはエラーを発生させます。
エラーが発生する例
以下の例を見てみましょう。
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)'
上記のクエリで表示されたエラーは、数値演算式の実行後にオーバーフロー(桁あふれ)が発生したことを示しています。本来「0 - 1 = -1」という負の結果になりますが、UNSIGNED型は負の値を表現できないため、エラーとなってしまうのです。
NO_UNSIGNED_SUBTRACTIONモードによる解決方法
このようなエラーは、NO_UNSIGNED_SUBTRACTION SQLモードを有効にすることで回避できます。このモードを有効にすると、UNSIGNED型同士の減算で結果が負になった場合でも、エラーではなく実際の負の値が返されるようになります。
mysql> Set sql_mode = 'NO_UNSIGNED_SUBTRACTION';
Query OK, 0 rows affected (0.00 sec)
mysql> Select CAST(0 AS UNSIGNED) -1;
+------------------------+
| CAST(0 AS UNSIGNED) -1 |
+------------------------+
| -1 |
+------------------------+
1 row in set (0.00 sec)
ご覧のとおり、NO_UNSIGNED_SUBTRACTIONモードを有効にした後は、同じクエリがエラーではなく「-1」という正しい結果を返すようになりました。
まとめ
NO_UNSIGNED_SUBTRACTION SQLモードは、UNSIGNED型の整数減算において負の結果が生じた際のオーバーフローエラーを防ぎ、符号付きの結果として処理させるための便利な設定です。差分計算などで負の値が発生しうる場面では、このモードの活用を検討するとよいでしょう。
-
C言語のprintf()における%n書式指定子とは?出力文字数を格納する特殊な機能を解説
C言語のprintf()における%n書式指定子とは? C言語には、%nという特殊な書式指定子が用意されています。一般的な書式指定子(%dや%sなど)が画面へ値を出力するのに対し、%nは何も出力しません。その代わり、対応する引数として渡されたポインタが指し示す変数に、「%nが出現するまでにprintf()が出力した文字数」を格納します。 ポイント: %n自体は画面に何も表示しません。文字列の出力には、別途printf()関数を呼び出して行います。 基本的な使用例 #include<stdio.h> int main() { int s; printf(The val
-
PHPのini_set()関数とは?使い方と設定変更方法を解説
ini_set()関数とはPHPでは、php.iniで定義された設定項目の一部を、ini_set()関数を使ってスクリプト内から動的に変更することができます。この関数は2つの文字列引数を受け取ります。第1引数には変更したい設定項目の名前を、第2引数には新しく割り当てる値を指定します。パラメータvar_name(設定名)すべての設定項目がini_set()で変更できるわけではありません。変更可能なオプションの一覧は、PHP公式マニュアルの付録に掲載されています。変更しようとした項目がスクリプトレベルでの変更に対応していない場合、設定は反映されないので注意が必要です。newvalue(新しい値)対