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

MySQLのDECIMAL型(10進数)の使い方を徹底解説!正確な数値を保存する方法

MySQLのDECIMAL型は、金額など誤差が許されない「正確な数値」を格納するためのデータ型です。FLOAT型やDOUBLE型は浮動小数点数として近似値を扱うため丸め誤差が発生しますが、DECIMAL型は文字列と同様の仕組みで数値を保持するため、正確な値をそのまま保存できます。

DECIMAL型の基本構文

DECIMAL型は以下のように、全体の桁数(M)と小数点以下の桁数(D)を指定して定義します。

yourColumnName DECIMAL(M, D);
  • M(精度): 小数点を含む全体の最大桁数(1〜65)
  • D(スケール): 小数点以下の桁数(0〜30)

例えば DECIMAL(6,2) の場合、「整数4桁+小数2桁」の合計6桁まで格納でき、最大値は 9999.99 となります。

DECIMAL型を使ったテーブル作成例

従業員情報テーブルを作成し、給与カラムにDECIMAL型を指定してみましょう。

mysql> create table EmployeeInformation
    -> (
    -> EmpId int auto_increment primary key,
    -> EmpName varchar(200),
    -> EmpSalary DECIMAL(6,2)
    -> );
Query OK, 0 rows affected (0.54 sec)

桁数オーバー時のエラー

定義した精度を超える値を挿入しようとすると、MySQLは範囲外エラーを返します。

mysql> insert into EmployeeInformation(EmpName,EmpSalary) values('John',6999999.50);
ERROR 1264 (22003): Out of range value for column 'EmpSalary' at row 1

このエラーは、EmpSalary カラムが DECIMAL(6,2)(整数部4桁まで)に対し、挿入しようとした値が整数部7桁あるために発生しています。

範囲内の値を挿入する

次に、指定した桁数に収まる正確な値を挿入します。

mysql> insert into EmployeeInformation(EmpName,EmpSalary) values('John',6999.50);
Query OK, 1 row affected (0.15 sec)

mysql> insert into EmployeeInformation(EmpName,EmpSalary) values('Mike',1234.56);
Query OK, 1 row affected (0.20 sec)

登録データの確認

すべてのレコードを表示して、値が正確に保存されていることを確認しましょう。

mysql> select * from EmployeeInformation;

実行結果は以下の通りです。

+-------+---------+-----------+
| EmpId | EmpName | EmpSalary |
+-------+---------+-----------+
|     1 | John    |   6999.50 |
|     2 | Mike    |   1234.56 |
+-------+---------+-----------+
2 rows in set (0.00 sec)

まとめ

  • DECIMAL型は誤差のない正確な数値を格納できるデータ型である
  • DECIMAL(M, D) の形式で、全体桁数Mと小数桁数Dを指定する
  • 精度を超える値を挿入すると「Out of range value」エラーが発生する
  • 金額計算など厳密な数値処理が必要な場面では、FLOATやDOUBLEではなくDECIMAL型を使用するのが推奨される
  1. MySQLでWITH ROLLUPを正しく使う方法!GROUP BYと組み合わせた集計テクニックを解説

    WITH ROLLUPとは?MySQLのWITH ROLLUPは、GROUP BY句と組み合わせて使用することで、グループごとの集計結果に加えて、全体の合計(総計)行を自動的に追加してくれる便利な機能です。レポート作成やデータ分析の際に、別途合計用のクエリを実行する必要がなくなるため、非常に効率的です。基本構文WITH ROLLUPを使用する際の基本的な構文は以下の通りです。select yourColumnName1,sum(yourColumnName2) from yourTableNamegroup by yourColumnName1 with rollup;サンプルテーブルの作成ま

  2. MySQLでCURDATE()とLIKE句を使った部分一致検索の方法

    MySQLにはCONTAINS()という名前の関数は存在しません。そのため、現在の日付(CURDATE())に関連する文字列で部分一致検索を行いたい場合は、CONCAT()関数とLIKE句を組み合わせる方法が有効です。本記事では、実際にサンプルテーブルを作成しながら、その手順を順番に解説していきます。現在の日付を確認するまず、CURDATE()関数を使って現在の日付を取得してみましょう。mysql> select curdate();実行結果は以下の通りです。+------------+ | curdate() | +------------+ | 2019-11-28 | +----