কম্পিউটার টিউটোরিয়াল

MySQL-এ FLOAT মান DECIMAL কলামে ইনসার্ট করলে ওয়ার্নিং দেখানো

DECIMAL কলামে FLOAT মান ইনসার্ট করলে ডেটা ট্রানকেট হয় (দশমিক কাটায়)। এই ওয়ার্নিং দেখতে SHOW WARNINGS কমান্ড ব্যবহার করুন।

উদাহরণ দিয়ে বুঝি

টেম্পোরারি টেবিল তৈরি করুন (DECIMAL টাইপ):

mysql> CREATE TEMPORARY TABLE WarningDemo (
    -> Value DECIMAL
    -> );
Query OK, 0 rows affected (0.13 sec)

FLOAT মান ইনসার্ট করুন:

mysql> INSERT INTO WarningDemo VALUES(9.80);
Query OK, 1 row affected, 1 warning (0.03 sec)

ওয়ার্নিং দেখুন:

mysql> SHOW WARNINGS;
+-------+------+--------------------------------------------+
| Level | Code | Message                                    |
+-------+------+--------------------------------------------+
| Note  | 1265 | Data truncated for column 'Value' at row 1 |
+-------+------+--------------------------------------------+
1 row in set (0.00 sec)

স্টোরড মান দেখুন:

mysql> SELECT * FROM WarningDemo;
+-------+
| Value |
+-------+
| 10    |

ব্যাখ্যা: DECIMAL বাই ডিফল্ট DECIMAL(10,0) মানে ০ ডেসিমেল প্লেস। তাই 9.80 ইনসার্ট করলে রাউন্ড হয়ে 10 হয়ে যায় এবং ওয়ার্নিং দিয়ে জানায়।

সমাধান: সঠিক প্রিসিশন/স্কেল দিন

CREATE TABLE WarningDemoFixed (
    Value DECIMAL(10, 2)  -- ১০ ডিজিট মোট, ২ ডেসিমেল প্লেস
);
INSERT INTO WarningDemoFixed VALUES(9.80); -- ওয়ার্নিং নেই, সঠিক 9.80 স্টোর হবে

DECIMAL(p, s) প্যারামিটার

  • p (Precision): মোট ডিজিট সংখ্যা (১-৬৫)
  • s (Scale): দশমিকের পর ডিজিট সংখ্যা (০-৩০, p-এর চেয়ে কম/সমান)

সেরা প্র্যাক্টিস: টাকা/পয়সা বা প্রিসিশন জরুরি ডেটার জন্য সবসময় DECIMAL(p, s) স্পেসিফাই করুন। FLOAT/DOUBLE ফ্লোটিং পয়েন্ট ইস্যু হতে পারে।

  1. MySQL-এ GROUP BY + MAX() ব্যবহার করে প্রতিটি গ্রুপের সর্বোচ্চ মান বের করা

  2. MySQL-এ SUBSTRING_INDEX এবং CAST দিয়ে ফ্লোট ভ্যালু দুটি কলামে ভাগ করা

  3. MySQL-এ LEFT JOIN ব্যবহার করে টেবিল A-র ডেটা টেবিল B-এ না থাকলে টেবিল C-তে ইনসার্ট করা

  4. MySQL-এ DECIMAL(19,2) কলামে ইনসার্ট সময় TRUNCATE ব্যবহার করে মান সংরক্ষণ করা