2013-11-27 10 views
5

मैं उपयोगकर्ता द्वारा बनाए गए कार्यों से संबंधित MySQL में कुछ अजीब व्यवहार देख रहा हूं। मैं जितना संभव हो इसे सरल बना दूंगा।MySQL फ़ंक्शन - अजीब विभाजन परिणाम?

mysql> SELECT 1/50 

+--------+ 
| 1/50 | 
+--------+ 
| 0.0200 | 
+--------+ 
1 row in set (0.00 sec) 

अब तक इतना अच्छा है। अब मैं इस प्रभाग को करने के लिए एक फ़ंक्शन बनाता हूं और फ़ंक्शन को कॉल करता हूं:

mysql> delimiter $$ 
mysql> create function myd(var decimal) returns decimal language sql deterministic 
    -> begin 
    ->  declare res decimal; 
    ->  set res = var/50; 
    ->  
    ->  return res; 
    -> end 
    -> $$ 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 
mysql> select myd(1); 
+--------+ 
| myd(1) | 
+--------+ 
|  0 | 
+--------+ 
1 row in set (0.00 sec) 

बहुत अजीब। ठीक है, के कुछ अन्य मूल्यों की कोशिश करते हैं:

mysql> select myd(10), myd(20), myd(50), myd(70), myd(100); 
+---------+---------+---------+---------+----------+ 
| myd(10) | myd(20) | myd(50) | myd(70) | myd(100) | 
+---------+---------+---------+---------+----------+ 
|  0 |  0 |  1 |  1 |  2 | 
+---------+---------+---------+---------+----------+ 
1 row in set (0.00 sec) 

मैं थोड़ा और अधिक परीक्षण किया था - लेकिन यह परिणाम है कि समारोह का परिणाम मान एक पूर्णांक तक पूर्ण किया जा रहा है से बहुत स्पष्ट है, समारोह के रूप में घोषित किए जाने के बावजूद returns decimal। मैंने टाइप decimal को float के साथ बदलने की कोशिश की लेकिन यह थोड़ा सा नहीं बदला।

तो यह गोल क्यों हो रहा है और, सबसे महत्वपूर्ण बात यह है कि मैं इसे कैसे रोकूं?

उत्तर

5

यदि आप दशमलव के लिए सटीक निर्दिष्ट नहीं करते हैं तो यह DECIMAL(M,0) डिफ़ॉल्ट रूप से शून्य अल्पविराम के बाद अंक होगा।

उदाहरण: अल्पविराम के बाद 3 अंक के लिए

decimal(10,3) 

के रूप में यह परिभाषित करें। अंश निर्दिष्ट करने के लिए

Source

+0

आह! ठीक है, मुझे देखने दो :) –

+0

कूल! वह यह था। –

0

जरूरत:

mysql> SELECT 1/2 ; 
+--------+ 
| 1/2 | 
+--------+ 
| 0.5000 | 
+--------+ 

mysql> SELECT CAST(1/50 AS DECIMAL); 
+-------------------------+ 
| CAST(1/50 AS DECIMAL) | 
+-------------------------+ 
|      0 | 
+-------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT CAST(1/50 AS DECIMAL(10,2)); 
+-------------------------------+ 
| CAST(1/50 AS DECIMAL(10,2)) | 
+-------------------------------+ 
|       0.02 | 
+-------------------------------+ 
0

दशमलव परिशुद्धता के बिना घोषित 0 परिशुद्धता का मतलब है।

mysql> select CAST(1/50 as Decimal); 
+-----------------------+ 
| CAST(1/50 as Decimal) | 
+-----------------------+ 
|      0 | 
+-----------------------+ 
1 row in set (0.00 sec) 

mysql> select CAST(1/50 as Decimal(10,4)); 
+-----------------------------+ 
| CAST(1/50 as Decimal(10,4)) | 
+-----------------------------+ 
|      0.0200 | 
+-----------------------------+ 
1 row in set (0.00 sec) 

यदि आप इसे फ्लोट या दशमलव (10,4) में बदलते हैं, तो यह काम करेगा।

mysql> delimiter $$ 
mysql> create function myd6(var float) returns float language sql deterministic begin declare res float; set res = var/50; return res; end$$ 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 
mysql> select myd6(1); 
+----------------------+ 
| myd6(1)    | 
+----------------------+ 
| 0.019999999552965164 | 
+----------------------+ 
1 row in set (0.00 sec) 
+0

आरई: "यदि आप फ्लैट में बदल जाते हैं तो यह काम करेगा" - कृपया मेरा प्रश्न पूरी तरह से पढ़ें। मैंने वहां कहा, "मैंने फ्लोट के साथ टाइप दशमलव को बदलने की कोशिश की लेकिन वह थोड़ा सा नहीं बदला।" –

+0

@AleksG, लेकिन यह मेरे उत्तर में स्निपेट में दिखाए गए अनुसार काम करता है? – DhruvPathak

संबंधित मुद्दे