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

MySQLで数値式のオーバーフローが発生した場合の対処方法を解説

MySQLでは、数値式の評価中にオーバーフローが発生すると、エラーが出力されます。例えば、符号付きBIGINT型の最大値は9223372036854775807であるため、以下の式を実行するとエラーになります。

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

このようなオーバーフローの問題は、MySQLにおいて主に次の2つの方法で回避できます。

方法1:値をUNSIGNED(符号なし)に変換する

1つ目の方法は、CAST関数を使って値をUNSIGNED型に変換するやり方です。符号付きの範囲を超える計算でも、符号なしの範囲に収まるため、エラーを回避できます。

mysql> Select CAST(9223372036854775807 AS UNSIGNED) + 1;
+------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) +1 |
+------------------------------------------+
| 9223372036854775808 |
+------------------------------------------+
1 row in set (0.07 sec)

このように、最大値に1を加えた「9223372036854775808」が正しく返され、エラーは発生しません。

方法2:厳密値演算(DECIMAL)を使用する

2つ目の方法は、厳密値演算を利用することです。オーバーフローが発生するかどうかは、オペランド(演算対象の値)の範囲によって決まります。数値に小数点を付けてDECIMAL型として扱うことで、より広い範囲の計算が可能になります。

mysql> Select 9223372036854775807.0 + 1;
+---------------------------+
| 9223372036854775807.0 + 1 |
+---------------------------+
| 9223372036854775808.0 |
+---------------------------+
1 row in set (0.01 sec)

上記のように、値を「9223372036854775807.0」と小数点付きで記述するとDECIMAL型として扱われ、結果も正確な「9223372036854775808.0」が返されます。

まとめ

BIGINT型の最大値を超える演算を行う場合、MySQLはデフォルトではエラーを返します。これを回避するには、CAST関数でUNSIGNED型に変換する方法と、小数点を付けてDECIMAL型として厳密値演算を行う方法の2つがあります。用途に応じて適切な方法を選択しましょう。

  1. Spring BootでローカルホストのMySQLに接続する方法を徹底解説

    Spring Bootアプリケーションからローカル環境のMySQLデータベースに接続するには、application.propertiesファイルにデータベースの接続情報を記述するのが基本です。本記事では、設定方法から実際に動作を確認するまでの手順を、サンプルコードとともにわかりやすく解説します。1. application.propertiesへの接続設定まず、プロジェクトのsrc/main/resources配下にあるapplication.propertiesファイルに、以下の設定を追加します。spring.datasource.username=yourMySQLUserName sp

  2. RailsはGemをどう扱っている?Bundlerの仕組みを徹底解説

    数週間前、RubyGemsがRubyのロードパス($LOAD_PATH)をどのように管理しているかについての記事を書きました。しかし実は、RailsはRubyGemsを直接使っていません。RailsはBundlerを使ってgemを管理しています。 Bundlerの仕組みを知らないと、Gemfileに1行追加するだけでコードがアプリに組み込まれる様子は、少し「魔法のように」感じられるかもしれません。いったいどうやって、Gemfileへの記述がアプリのコードとして読み込まれるのでしょうか?Bundler、Rails、RubyGemsはどのように連携して、依存関係の管理を簡単にしているのでしょうか