MySQL-এ VARCHAR কলামে সংরক্ষিত সংখ্যাসূচক স্ট্রিংগুলোকে সংখ্যা হিসেবে কম্পেয়ার করতে CAST(... AS SIGNED) বা CAST(... AS UNSIGNED) ব্যবহার করুন।
সমস্যা: স্ট্রিং কম্পারিশন
'999999' > '1235667' -- TRUE (লেক্সিকোগ্রাফিক্যালি: '9' > '1')
-- কিন্তু সংখ্যা হিসেবে: 999999 < 1235667
সমাধান: CAST দিয়ে নাম্বারিক কম্পারিশন
CREATE TABLE compare_strings_demo (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
value VARCHAR(100)
);
INSERT INTO compare_strings_demo (value) VALUES
('1235667'), ('999999'), ('999888'), ('567433'), ('2345123');
স্ট্রিং কম্পারিশন (ভুল ফলাফল)
SELECT * FROM compare_strings_demo WHERE value = '999999'; -- স্ট্রিং ম্যাচ, OK
SELECT * FROM compare_strings_demo WHERE value > '1000000'; -- ভুল! '999999' > '1000000' স্ট্রিংত বড়
নাম্বারিক কম্পারিশন (সঠিক)
SELECT * FROM compare_strings_demo
WHERE CAST(value AS UNSIGNED) = 999999;
ফলাফল
+----+--------+
| id | value |
+----+--------+
| 2 | 999999 |
+----+--------+
CAST টাইপস
| টাইপ | রেঞ্জ | ব্যবহার |
|---|---|---|
| SIGNED | -2147483648 to 2147483647 | নেগেটিভ সংখ্যা থাকলে |
| UNSIGNED | 0 to 4294967295 | শুধু পজিটিভ (বড় সংখ্যা) |
| DECIMAL | নির্দিষ্ট প্রিসিশন | দশমিক সংখ্যা |
অন্যান্য কনভার্সন ফাংশন
CAST(value AS UNSIGNED) -- ANSI SQL স্ট্যান্ডার্ড
CONVERT(value, UNSIGNED) -- ODBC সিনট্যাক্স
value + 0 -- শর্টহ্যান্ড (MySQL-স্পেসিফিক)
value * 1 -- শর্টহ্যান্ড
WHERE-এ CAST ব্যবহার (ইনডেক্স ব্যবহার হয় না)
-- ইনডেক্স ব্যবহার হবে না
SELECT * FROM compare_strings_demo WHERE CAST(value AS UNSIGNED) > 1000000;
-- ভালো: জেনারেটেড কলাম + ইনডেক্স (MySQL 5.7+)
ALTER TABLE compare_strings_demo
ADD COLUMN value_num INT GENERATED ALWAYS AS (CAST(value AS UNSIGNED)) STORED,
ADD INDEX idx_value_num (value_num);
SELECT * FROM compare_strings_demo WHERE value_num > 1000000;
সর্টিং-ও নাম্বারিক করুন
SELECT * FROM compare_strings_demo
ORDER BY CAST(value AS UNSIGNED);