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 ফ্লোটিং পয়েন্ট ইস্যু হতে পারে।