परिचय
जब संख्याएं VARCHAR कॉलम में स्टोर होती हैं, तो सामान्य ORDER BY Price DESC लेक्सिकोग्राफिक (स्ट्रिंग) क्रम देता है: '80', '800', '108', '765' → '800', '80', '765', '108' (गलत)। संख्यात्मक क्रम के लिए लंबाई और मान दोनों से क्रमबद्ध करना पड़ता है।
उदाहरण: टेबल बनाना और डेटा डालना
mysql> CREATE TABLE DemoTable (
-> Price VARCHAR(20)
-> );
Query OK, 0 rows affected (0.92 sec)
mysql> INSERT INTO DemoTable VALUES('80');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable VALUES('800');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable VALUES('108');
Query OK, 1 row affected (0.50 sec)
mysql> INSERT INTO DemoTable VALUES('765');
Query OK, 1 row affected (0.14 sec)
सभी रिकॉर्ड देखना
mysql> SELECT * FROM DemoTable;
आउटपुट:
+-------+
| Price |
+-------+
| 80 |
| 800 |
| 108 |
| 765 |
+-------+
4 rows in set (0.00 sec)
अधिकतम से न्यूनतम (संख्यात्मक) क्रमबद्ध करने की क्वेरी
mysql> SELECT * FROM DemoTable
-> ORDER BY LENGTH(Price) DESC, Price DESC;
परिणाम
+-------+
| Price |
+-------+
| 800 |
| 765 |
| 108 |
| 80 |
+-------+
4 rows in set (0.00 sec)
व्याख्या
LENGTH(Price) DESC- पहले स्ट्रिंग लंबाई के अवरोही क्रम में (अधिक अंक = बड़ी संख्या)Price DESC- समान लंबाई वालों के लिए लेक्सिकोग्राफिक अवरोही क्रम- '800' (लंबाई 3) → '765' (लंबाई 3) → '108' (लंबाई 3) → '80' (लंबाई 2)
- लंबाई 3 वालों में: '800' > '765' > '108' (स्ट्रिंग तुलना संख्यात्मक तुलना के समान काम करती है जब लंबाई समान हो)
बेहतर विकल्प: CAST करके संख्यात्मक क्रमबद्धिकरण
SELECT * FROM DemoTable ORDER BY CAST(Price AS UNSIGNED) DESC;
यह अधिक सीधा, पठनीय, और सभी मामलों के लिए सही है (ऋणात्मक संख्याओं के लिए SIGNED उपयोग करें)।
क्यों VARCHAR में संख्याएं स्टोर न करें?
- क्रमबद्धिकरण जटिल
- गणना त्रुटिपूर्ण
- स्टोरेज अक्षम
- डेटा अखंडता जोखिम
हमेशा संख्यात्मक डेटा के लिए INT, DECIMAL, BIGINT आदि उपयोग करें।