MySQL में संख्यात्मक क्रमबद्धता के लिए अंतर्निहित प्रकार परिवर्तन
जब संख्यात्मक डेटा VARCHAR/CHAR कॉलम में संग्रहीत होता है, तो ORDER BY column*1 से गुणा करने से MySQL को स्ट्रिंग को संख्या में अंतर्निहित रूप से परिवर्तित करने के लिए मजबूर किया जाता है, जिससे शब्दकोश क्रम के बजाय उचित संख्यात्मक क्रमबद्धता सक्षम होती है।
समस्या: स्ट्रिंग क्रमबद्धता बनाम संख्यात्मक क्रमबद्धता
पहले एक स्ट्रिंग ID टेबल बनाते हैं:
mysql> CREATE TABLE DemoTable1441 (
-> Id VARCHAR(30)
-> );
Query OK, 0 rows affected (0.53 sec)
mysql> INSERT INTO DemoTable1441 VALUES ('301'), ('23'), ('345'), ('10'), ('38');
Query OK, 5 rows affected (0.21 sec)
mysql> SELECT * FROM DemoTable1441;
+------+
| Id |
+------+
| 301 |
| 23 |
| 345 |
| 10 |
| 38 |
+------+
5 rows in set (0.00 sec)
स्ट्रिंग क्रमबद्धता (डिफ़ॉल्ट)
mysql> SELECT * FROM DemoTable1441 ORDER BY Id; +------+ | Id | +------+ | 10 | | 23 | | 301 | | 345 | | 38 | +------+ 5 rows in set (0.00 sec)
स्ट्रिंग क्रमबद्धता: '1' < '2' < '3' → 10, 23, 301, 345, 38
संख्यात्मक क्रमबद्धता (*1 ट्रिक के साथ)
mysql> SELECT * FROM DemoTable1441 ORDER BY Id*1; +------+ | Id | +------+ | 10 | | 23 | | 38 | | 301 | | 345 | +------+ 5 rows in set (0.00 sec)
संख्यात्मक क्रमबद्धता: 10 < 23 < 38 < 301 < 345 ✓
यह कैसे काम करता है
Id * 1अंकगणितीय संचालन करता है- MySQL स्ट्रिंग को संख्या में परिवर्तित करता है
- परिणाम संख्यात्मक रूप से क्रमबद्ध होता है
- मूल स्ट्रिंग मान अपरिवर्तित रहता है
बेहतर विकल्प: CAST()
-- स्पष्ट कास्टिंग (अनुशंसित) SELECT * FROM DemoTable1441 ORDER BY CAST(Id AS UNSIGNED); -- या SIGNED के लिए SELECT * FROM DemoTable1441 ORDER BY CAST(Id AS SIGNED);
चेतावनी
सर्वोत्तम अभ्यास
- संख्यात्मक डेटा के लिए संख्यात्मक डेटा प्रकार (INT, DECIMAL) का उपयोग करें
- स्पष्टता के लिए स्पष्ट CAST() पसंद करें
- बड़े डेटासेट के लिए, संख्यात्मक कॉलम पर इंडेक्स बनाएं