VARCHAR कॉलम में संख्यात्मक डेटा स्टोर होने पर डिफ़ॉल्ट सॉर्टिंग लेक्सिकोग्राफिक (अक्षरानुक्रम) होती है: 1, 10, 100, 2, 20...। संख्यात्मक क्रम के लिए LPAD या CAST उपयोग करें।
समस्या प्रदर्शन
mysql> SELECT * FROM SortingvarcharDemo ORDER BY List;
+------+
| List |
+------+
| 1 |
| 199 |
| 78 |
| 9 |
| 99 |
| 999 |
+------+ -- गलत क्रम!
समाधान 1: LPAD के साथ (निर्दिष्ट चौड़ाई)
mysql> SELECT * FROM SortingvarcharDemo
-> ORDER BY LPAD(List, 6, '0') ASC;
+------+
| List |
+------+
| 1 |
| 9 |
| 78 |
| 99 |
| 199 |
| 999 |
+------+ -- सही संख्यात्मक क्रम
LPAD(List, 6, '0') मान को बाएं से '0' से पैड करके 6 वर्ण का बनाता है।
समाधान 2: CAST के साथ (अधिक लचीला)
SELECT * FROM SortingvarcharDemo
ORDER BY CAST(List AS UNSIGNED) ASC;
यह नकारात्मक संख्याओं और दशमलव के लिए भी काम करता है।
समाधान 3: ORDER BY 0+col ट्रिक
SELECT * FROM SortingvarcharDemo
ORDER BY 0 + List ASC;
MySQL स्ट्रिंग को संख्या में बदलने के लिए अंकगणितीय संक्रिया करता है।
प्रदर्शन नोट
CASTऔर0+colइंडेक्स उपयोग नहीं कर सकते।- बड़े डेटासेट के लिए, संख्यात्मक कॉलम (
INT,DECIMAL) उपयोग करना बेहतर। - यदि VARCHAR जरूरी है, तो
GENERATED COLUMNमें संख्यात्मक संस्करण स्टोर करें और उस पर इंडेक्स बनाएं।