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

MySQL-এ VARCHAR কলামে স্ট্রিং ও সংখ্যা মিশ্রিত ডেটা সর্ট করা (ORDER BY + 0)

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)
  1. MySQL에서 DOUBLE과 DATE를 VARCHAR에 저장해도 될까?

  2. MySQL-এ SUBSTRING_INDEX ব্যবহার করে হাইফনের পরের সংখ্যা মুছে ফেলা

  3. MySQL-এ সংখ্যা মিশ্র স্ট্রিং সর্ট করুন

  4. MySQL-এ REGEXP ব্যবহার করে নির্দিষ্ট সংখ্যা দিয়ে শুরু হওয়া স্ট্রিং-নম্বর রেকর্ড ফেচ করা