MySQL-এ VARCHAR কলামে সংখ্যা এবং অক্ষর মিশ্রিত থাকলে (যেমন '100A', '101J') স্ট্রিং সর্ট দেওয়া ভুল ফলাফল দেয়। সংখ্যা অংশ অনুযায়ী সর্ট করতে ORDER BY col+0, col ট্রিক ব্যবহার করা হয়।
টেবিল এবং ডেটা
CREATE TABLE DemoTable (
StudentCode VARCHAR(20)
);
INSERT INTO DemoTable VALUES('101J');
INSERT INTO DemoTable VALUES('100A');
INSERT INTO DemoTable VALUES('100B');
INSERT INTO DemoTable VALUES('101S');
INSERT INTO DemoTable VALUES('103M');
স্ট্রিং সর্ট (ডিফল্ট)
SELECT * FROM DemoTable ORDER BY StudentCode;
100A, 100B, 101J, 101S, 103M -- লেক্সিকোগ্রাফিক্যাল
সঠিক সর্ট: সংখ্যা অংশে যেন নмериক্যালি
SELECT * FROM DemoTable
ORDER BY StudentCode + 0, StudentCode;
ফলাফল
+-------------+
| StudentCode |
+-------------+
| 100A |
| 100B |
| 101J |
| 101S |
| 103M |
+-------------+
কিভাবে কাজ করে
StudentCode + 0— স্ট্রিংকে সংখ্যায় কনভার্ট করে (প্রিফিক্স নম্বর)- '100A' + 0 = 100, '101J' + 0 = 101
- প্রথমে নম্বর অনুযায়ী সর্ট, তারপর স্ট্রিং অনুযায়ী (টাই ব্রেকার)
+ 0ইমপ্লিসিট CAST AS UNSIGNED
সতর্কতা
MySQL ৮.০+ তে StudentCode + 0 দিয়ে ওয়ার্নিং আসতে পারে: Truncated incorrect DOUBLE value। স্ট্রিক্ট মোডে এড়াতে CAST(StudentCode AS UNSIGNED) ব্যবহার করুন।
বিকল্প: REGEXP দিয়ে নম্বর বের করে সর্ট
ORDER BY CAST(StudentCode AS UNSIGNED), StudentCode
নরমালাইজড ডিজাইন (ভালো)
StudentCodeNum INT, -- 100, 101, 103
StudentCodeSuffix CHAR(1) -- A, B, J, S, M
INDEX idx_code (StudentCodeNum, StudentCodeSuffix)