আমার কাছে একটি বাগের মতো মনে হচ্ছে এবং আমি এই চমকপ্রদ আচরণটি এখানে নিশ্চিত করতে পারি:
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 |
+------+
ঠিক আছে, int মানগুলি ব্যবহার করলে ত্রুটিটি মনে হয় না।
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 | |
+-------+--------------+------+-----+---------+-------+
ত্রুটিটি কমান্ড লাইন ইন্টারফেসের সাথে বিচ্ছিন্ন নয়, এটি পাইথন 2-মাইএসকিএল-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) কাজ করে।
পরিশেষে, স্পষ্টত: দশমিক (২,১) এ castালাই একই ত্রুটি তৈরি করে তবে একটি সতর্কতা সহ:
select cast(20 as decimal(2,1));
+--------------------------+
| cast(20 as decimal(2,1)) |
+--------------------------+
| 9.9 |
+--------------------------+
1 row in set, 1 warning (0.00 sec)