mysqlストレージ中にdecimal値が自動的に四捨五入されるこのピットについて
3888 ワード
私の仕事は日常的にマイクロソフト系を使っています.SQL SERVICEのストレージプロセスはとても強くて、私もストレージプロセスが好きです.MySQLと縁を結んだのは、5年前、いくつかの理由で、会社がオープンソースの無料データベースを要求したからです.多くの場合、mysqlを使用するプログラマーはストレージ・プロシージャを使用しません.デバッグが面倒なほか、さまざまな小さな問題があります.実は、MySQLはここ数年発展が速いですが、SQL SERVICEとの差は大きいです.さあ、くだらないことを言わないで、話は本題に戻ります.
まず、私のシーンを説明します.
もし、注文書t_があればorder構造は次のとおりです.
フィールド名
を選択します.
説明
id
int(11)
id,自己増加,プライマリキー
orderNo
varchar(20)
オーダー番号、一意制約
price
decimal(10,2)
価格
この表の完全性にこだわるのではなく、なぜ価格がintで単位を表す額ではないのかにこだわるのではないでしょうか.次に、受注ストレージの生成プロセスを書きます.
私たちが呼び出したとき、価格に小数点を入力した場合、次のようになります.
テーブルt_に格納されていることがわかりますorderのこのデータ、priceは6で、四捨五入しました...正直に言うと、以前はintでお金の最小単位(現在の業務の最小単位)を表していましたが、例えばRMB 1元で100の整数型を貯金していたので、MySQLという穴に気づかなかったのです.もちろん、このピットの解決策も簡単です.decimal(10,2)などの精度を指定すると、ストレージ・プロシージャを次のように変更できます.
この穴、ここに記録して、自分の1つの注意に対してでしょう!
まず、私のシーンを説明します.
もし、注文書t_があればorder構造は次のとおりです.
フィールド名
を選択します.
説明
id
int(11)
id,自己増加,プライマリキー
orderNo
varchar(20)
オーダー番号、一意制約
price
decimal(10,2)
価格
この表の完全性にこだわるのではなく、なぜ価格がintで単位を表す額ではないのかにこだわるのではないでしょうか.次に、受注ストレージの生成プロセスを書きます.
CREATE PROCEDURE `p_order_create`(IN `_OrderNo` tinytext,IN `_Price` decimal,OUT `_res` int)
BEGIN
/*
:
:
IN `_OrderNo` tinytext,
IN `_Price` decimal
_res : ,0 , id
*/
INSERT INTO t_order
(`orderNo`,`price`)
VALUES
(_OrderNo,_Price);
select @@Identity INTO _res;
END;
私たちが呼び出したとき、価格に小数点を入力した場合、次のようになります.
CALL p_order_create('abc',5.8,@res)
テーブルt_に格納されていることがわかりますorderのこのデータ、priceは6で、四捨五入しました...正直に言うと、以前はintでお金の最小単位(現在の業務の最小単位)を表していましたが、例えばRMB 1元で100の整数型を貯金していたので、MySQLという穴に気づかなかったのです.もちろん、このピットの解決策も簡単です.decimal(10,2)などの精度を指定すると、ストレージ・プロシージャを次のように変更できます.
CREATE PROCEDURE `p_order_create`(IN `_OrderNo` tinytext,IN `_Price` decimal(10,2),OUT `_res` int)
BEGIN
/*
:
:
IN `_OrderNo` tinytext,
IN `_Price` decimal
_res : ,0 , id
*/
INSERT INTO t_order
(`orderNo`,`price`)
VALUES
(_OrderNo,_Price);
select @@Identity INTO _res;
END;
この穴、ここに記録して、自分の1つの注意に対してでしょう!