ইউনিয়ন castালাই পূর্ণসংখ্যায় সিলিংয়ের ক্ষেত্রে সমস্যা (দশমিক)


10

আমার এই দৃশ্যটি আছে, দেখে মনে হচ্ছে যে মাইএসকিউএল বৃহত্তম দশমিক মান নিচ্ছে এবং অন্যান্য মানগুলিকে এতে ফেলে দেওয়ার চেষ্টা করে।

সমস্যাটি হ'ল এই ক্যোয়ারীটি বাহ্যিক লাইব্রেরি দ্বারা উত্পাদিত হয়েছে, সুতরাং অন্ততপক্ষে এই স্তরে আমার এই কোডটির নিয়ন্ত্রণ নেই। কীভাবে এটি ঠিক করবেন আপনার কিছু ধারণা আছে?

SELECT 20 AS x
  UNION SELECT null
  UNION SELECT 2.2;
+------+
| x    |
+------+
|  9.9 | -- why from 20 to 9.9
| NULL |
|  2.2 |
+------+

প্রত্যাশিত ফলাফল

+------+
| x    |
+------+
|   20 | -- or 20.0, doesn't matter really in my case
| NULL |
|  2.2 |
+------+

আরও প্রসঙ্গ যুক্ত করা হচ্ছে, ব্যাচগুলির পরিবর্তনগুলি বিশেষত পদ্ধতি প্রসঙ্গে, সংরক্ষণের জন্য আমি একটি এক্সটেনশন লাইব্রেরি http://entityframework-extensions.net/ এর সাথে সত্ত্বা ফ্রেমওয়ার্ক 6 ব্যবহার করছি ul ।


1
20 একরকম 9.9 হয় ?! এটা ঠিক মনে হচ্ছে না।
dbdemon

2
ডিবিফিডেলে মাইএসকিউএল ৮.০ একই বোকামি দেখায়: dbfiddle.uk/…
dezso

আরও বিভ্রান্তিকর ... দুর্দান্ত SELECT 20 UNION SELECT null UNION SELECT 40 UNION SELECT 4.3;কাজ করে
ইভান ক্যারল

আপনার প্রয়োজন অনুসারে আউটপুট পোস্ট করুন প্লিজ। এছাড়াও, উত্পন্ন কোডটির উপর আপনার কতটা নিয়ন্ত্রণ রয়েছে: উদাহরণস্বরূপ আপনি 20 থেকে 20.0 টাইপ বা 2.2 থেকে 2 টাইপ করতে পারেন?
কিসিগমা

আমি এখন আরও প্রসঙ্গ যুক্ত করেছি, আমার ক্ষেত্রে একটি সম্ভাব্য সমাধান হ'ল কোডটিতে মান 20.0 চাপিয়ে দেওয়া, আমি সমস্যাটি পরীক্ষা করে ঠিক করেছি, তবে এটি একটি বাগের মতো দেখাচ্ছে কারণ কেবল নির্দিষ্ট দৃশ্যেই ঘটে যেখানে নাল জড়িত এবং এতে রয়েছে যে আদেশ
ngcbassman

উত্তর:


9

আমার কাছে একটি বাগের মতো মনে হচ্ছে এবং আমি এই চমকপ্রদ আচরণটি এখানে নিশ্চিত করতে পারি:

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)

1
CAST থেকে ডাবল করা মাইএসকিউএলে একটি সিনট্যাক্স ত্রুটি। এর পরিবর্তে একটি দশমিক কাজ করে:SELECT CAST(20 AS DECIMAL) AS x UNION SELECT NULL UNION SELECT 2.2;
Qsigma

4
আমি এটিকে মারিয়াডিবি জিরার বাগ হিসাবে রিপোর্ট করার স্বাধীনতা নিয়েছি: jira.mariadb.org/browse/MDEV-15999
dbdemon

1
সমস্যাটি মারিয়াডিবি 10.3-এ স্থির করা হয়েছে বলে মনে হয়। (আমি সবেমাত্র 10.3.6 দিয়ে পরীক্ষা করেছি এবং 10.3.1 এও কাজ করার কথা রয়েছে।)
dbdemon

2
কৌতূহলীভাবে আপনি যদি 20হিসাবে নির্দিষ্ট করে কোন সমস্যা নেই 020। আচরণটি মারিয়াডিবি 10.2 এবং মাইএসকিউএল 8.0-তে একই রকম । আক্ষরিক দৈর্ঘ্যের মতো দেখতে মিলিত কলামটির ধরণের প্রভাব পড়ে। যে কোনও ইভেন্টে, এটি অবশ্যই আমার বইয়ের একটি বাগ।
অ্যান্ড্রি এম

1
আমি মাইএসকিউএল 8.0 এ শূন্যতা ছাড়াই দেখতে পাচ্ছি (যদিও এটি মারিয়াডিবি 10.2-এ ঠিক আছে)। আপনি যদি শীর্ষস্থানীয় শূন্য বা কোনও গণনা অন্তর্ভুক্ত করেন তবে কলামের আকারেও পার্থক্য রয়েছে
মিক ও'হ

5

বাগ এমডিইভি -15999

ডিবিডিমন দ্বারা দায়ের করা বাগ এমডিইভি -15999 এটি জানিয়েছে। এটি 10.3.1 এ স্থির করা হয়েছে।

অদ্ভুত মাইএসকিউএল / মারিয়াডিবি প্রকৃতি

ডক্স থেকে,

প্রথম SELECTবিবৃতি থেকে প্রাপ্ত কলামের নামগুলি ফলাফলগুলির জন্য কলামের নাম হিসাবে ব্যবহৃত হয়। প্রতিটি SELECTস্টেটমেন্টের সম্পর্কিত পজিশনে তালিকাবদ্ধ নির্বাচিত কলামগুলিতে একই ডেটা টাইপ থাকা উচিত। (উদাহরণস্বরূপ, প্রথম বিবৃতি দ্বারা নির্বাচিত প্রথম কলামে অন্যান্য বিবৃতি দ্বারা নির্বাচিত প্রথম কলামের মতো একই ধরণের হওয়া উচিত))

যদি সম্পর্কিত SELECTকলামগুলির উপাত্তের ধরণ না মেলে, UNIONফলস্বরূপ কলামগুলির প্রকার এবং দৈর্ঘ্য সমস্ত SELECTবিবৃতি দ্বারা পুনরুদ্ধার করা মানগুলিকে বিবেচনা করে ।

এই ক্ষেত্রে, তারা পুনর্মিলন করে decimalএবং integerপূর্ণসংখ্যাটিকে এমন কোনওটিতে প্রচার করে decimalযা এতে ধারণ করে না। আমি জানি এটি ভয়াবহ, তবে সমানভাবে ভয়াবহ হ'ল চুপচাপ এমন আচরণ করা।

SELECT CAST(20 AS decimal(2,1));
+--------------------------+
| CAST(20 AS decimal(2,1)) |
+--------------------------+
|                      9.9 |
+--------------------------+

যা এই সমস্যার পথ সুগম করে বলে মনে হচ্ছে।


SELECT cast(20 as signed) UNION SELECT null UNION SELECT 2.2 ;একই (9.9) ভুল ফলাফল উত্পাদন করে। তবে আমরা যদি সেখানে "অবিস্মরণযুক্ত" ব্যবহার করি তবে এটি সব ঠিকঠাক হয়। চিত্র দেখুন ...
ypercubeᵀᴹ

SELECT -20 UNION SELECT null UNION SELECT 2.2 ;ঠিক মতো কাজ SELECT 20. UNION SELECT null UNION SELECT 2.2 ;
করেও

3
কী অন্তর্দৃষ্টি এখানে যে মাইএসকিউএল একটি ডাটা টাইপ যে ধরে রাখতে পারেন নির্বাচিত করেছে 2.2কিন্তু হয় খুব সংকীর্ণ রাখা 20। আপনি এটি সর্বশেষ নির্বাচিত ধারাটিতে পরিবর্তন করে এটি দেখতে পারেন CAST(2.2 AS DECIMAL(10,2)), যা 20.0প্রথম সারি হিসাবে দেয় (অন্তর্নিহিতভাবে চলমান CAST(20 AS DECIMAL(10,2)))।
আইএমএসওপি

1
আশ্চর্যের বিষয় এটি কেবল ডাটা টাইপের ভিত্তিতে নয় 2.2। আপনি চেষ্টা যদি select 20000 union select null union select 2.22আপনি পেতে 9999.99একটি, decimal(6,2)। মানটি ধরে রাখার জন্য এটি সর্বদা এক অঙ্কের থেকে খুব ছোট
মিক ও'হিয়া

1
@ মিক ইয়ে আপনি যদি NULLমাঝখানে মানটি ফেলে দেন তবে এটি নির্ভুল 1 সংক্ষিপ্ত করে গণনা করে।
সালমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.