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

MySQLでDECIMAL型の小数が丸められるのを防ぐ方法

MySQLの小数フィールドの丸めを防ぐには

MySQLでは、DECIMAL() 型の定義方法を工夫することで、小数フィールドの値が勝手に丸められるのを防ぐことができます。まずは、丸めが発生してしまう典型的な例を見てみましょう。

丸めが発生する例:DECIMAL(7)

小数点以下の桁数を指定せずに DECIMAL 型を定義すると、値は整数に丸められてしまいます。以下のようにデモ用テーブルを作成します。

mysql> create table stopRoundingDemo
    -> (
    -> Amount DECIMAL(7)
    -> );
Query OK, 0 rows affected (0.67 sec)

次に、INSERT文を使ってテーブルにレコードを挿入します。

mysql> insert into stopRoundingDemo values(7836.783);
Query OK, 1 row affected, 1 warning (0.43 sec)
mysql> insert into stopRoundingDemo values(1737.67);
Query OK, 1 row affected, 1 warning (0.23 sec)
mysql> insert into stopRoundingDemo values(110.50);
Query OK, 1 row affected, 1 warning (0.33 sec)

SELECT文でテーブル内のすべてのレコードを表示してみましょう。

mysql> select *from stopRoundingDemo;

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

+--------+
| Amount |
+--------+
| 7837   |
| 1738   |
| 111    |
+--------+
3 rows in set (0.08 sec)

上記の出力結果を見ると、挿入した小数値が整数に丸められていることがわかります。これは、DECIMAL(7) のように小数点以下の桁数を指定していないためです。また、INSERT時に「1 warning」と表示されている点にも注目してください。これは値が丸められたことを示す警告です。

丸めを防ぐ正しい方法:DECIMAL(10,4)

小数を丸めずにそのまま保存したい場合は、DECIMAL 型の第2引数で小数点以下の桁数を明示的に指定します。ここでは、全体で10桁・小数点以下4桁を持つ DECIMAL(10,4) を使って新しいテーブルを作成します。

mysql> create table stopRoundingDemo2
    -> (
    -> Amount DECIMAL(10,4)
    -> );
Query OK, 0 rows affected (0.81 sec)

先ほどと同じ値をINSERT文で挿入します。

mysql> insert into stopRoundingDemo2 values(7836.783);
Query OK, 1 row affected (0.14 sec)
mysql> insert into stopRoundingDemo2 values(1737.67);
Query OK, 1 row affected (0.14 sec)
mysql> insert into stopRoundingDemo2 values(110.50);
Query OK, 1 row affected (0.16 sec)

今度は警告(warning)が発生していないことに注目してください。SELECT文で確認してみましょう。

mysql> select *from stopRoundingDemo2;

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

+-----------+
| Amount    |
+-----------+
| 7836.7830 |
| 1737.6700 |
| 110.5000  |
+-----------+
3 rows in set (0.00 sec)

まとめ

このように、DECIMAL 型を定義する際に DECIMAL(全体の桁数, 小数点以下の桁数) の形式で小数点以下の桁数を指定すれば、MySQLが自動的に値を丸めることを防げます。金額など精度が重要なデータを扱う場合は、必ず小数点以下の桁数を明示的に指定するようにしましょう。

  1. MySQLでフィールド値に含まれるカンマの数をカウントする方法

    MySQLでフィールド値に含まれるカンマの数をカウントする方法カンマ区切りで保存されたデータから、カンマがいくつ含まれているかを調べたいケースは意外と多くあります。MySQLではLENGTH()関数とREPLACE()関数を組み合わせることで、シンプルなクエリひとつでカンマの個数をカウントできます。基本構文以下がカンマをカウントするための基本構文です。select length(対象カラム名) - length(replace(対象カラム名, ,, )) as エイリアス名 from テーブル名;このクエリの仕組みは非常にシンプルです。元の文字列の長さから、カンマをすべて削除した文字列の長さを

  2. MySQLで他のカラムの値から新しいカラムの値を導出する方法

    MySQLではユーザー定義変数(ユーザー変数)を活用することで、既存のカラムの値をもとに別のカラムの値を計算・導出できます。本記事では、累積和(累積合計)を求める具体例を通して、その方法をわかりやすく解説します。サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable1868 ( Value int ); Query OK, 0 rows affected (0.00 sec)レコードの挿入insertコマンドを使って、テーブルにデータを挿入します。mysql> insert into DemoTable1