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で単位を表す額ではないのかにこだわるのではないでしょうか.次に、受注ストレージの生成プロセスを書きます.
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つの注意に対してでしょう!