मेरे लिए एक बग की तरह दिखता है और मैं इस अजीब व्यवहार की पुष्टि कर सकता हूं:
10.2.14-MariaDB
यदि संभव हो तो आप पूर्णांक मान को दोगुना कर सकते हैं:
SELECT cast(20 as double) UNION SELECT null UNION SELECT 2.2;
या सुनिश्चित करें कि आपके पास पहले डबल मूल्य है:
SELECT 2.2 UNION SELECT null UNION SELECT 22;
@ इवान कैरोल के जवाब में टिप्पणियों को पढ़ने के बाद आगे की टिप्पणियों
select 20 union select null union select 2;
+------+
| 20 |
+------+
| 20 |
| NULL |
| 2 |
+------+
ठीक है, इंट वैल्यू का उपयोग करने से त्रुटि उत्पन्न नहीं होती है।
select 20 union select null union select 9.0;
+------+
| 20 |
+------+
| 9.9 |
| NULL |
| 9.0 |
+------+
त्रुटि: लगता है जैसे उत्पादन दशमलव (2,1) है
create table tmp as select * from (select 20 as x
union
select null
union
select 9.0) as t
describe tmp;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| x | decimal(2,1) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
त्रुटि कमांड लाइन इंटरफ़ेस के लिए अलग नहीं है, यह python2-mysql-1.3.12-1.fc27.x86_64 के लिए भी मौजूद है:
>>> import MySQLdb
>>> db = MySQLdb.connect(host="localhost", user="*****", passwd="*****", db="test")
>>> cur = db.cursor()
>>> cur.execute("SELECT 20 union select null union select 2.2")
3L
>>> for row in cur.fetchall() :
... print row
...
(Decimal('9.9'),)
(None,)
(Decimal('2.2'),)
अजीब तरह से पर्याप्त त्रुटि गायब हो जाती है अगर नल पहले या आखिरी में ले जाया जाता है:
select null union select 20 union select 9.0;
select 20 union select 9.0 union select null;
+------+
| NULL |
+------+
| NULL |
| 20.0 |
| 9.0 |
+------+
यदि नल को पहले रखा गया है, तो परिणामी प्रकार दशमलव (20,1) है। यदि शून्य को अंतिम परिणाम के रूप में रखा गया है तो दशमलव (3,1) है
यदि दूसरा पैर यूनियन में जोड़ा जाता है, तो त्रुटि भी गायब हो जाती है:
select 20 union select 6 union select null union select 9.0;
+------+
| 20 |
+------+
| 20.0 |
| 6.0 |
| NULL |
| 9.0 |
+------+
परिणामी प्रकार दशमलव (20,1)
बीच में एक और अशक्त जोड़ना त्रुटि को बरकरार रखता है:
select 20 union select null union select null union select 9.0;
+------+
| 20 |
+------+
| 9.9 |
| NULL |
| 9.0 |
+------+
लेकिन शुरुआत में एक अशक्त जोड़ना इसे ठीक करता है:
select null union select 20 union select null union select null union select 9.0;
+------+
| NULL |
+------+
| NULL |
| 20.0 |
| 9.0 |
+------+
जैसा कि उम्मीद है कि पहले मूल्य दशमलव (3,1) काम करता है।
अंत में, दशमलव (2,1) में स्पष्ट रूप से कास्टिंग करना एक ही त्रुटि उत्पन्न करता है लेकिन चेतावनी के साथ:
select cast(20 as decimal(2,1));
+--------------------------+
| cast(20 as decimal(2,1)) |
+--------------------------+
| 9.9 |
+--------------------------+
1 row in set, 1 warning (0.00 sec)