समस्या
जब संख्यात्मक डेटा VARCHAR/CHAR कॉलम में संग्रहीत होता है, तो स्ट्रिंग तुलना वर्णानुक्रम में होती है (जैसे '9' > '10'), जो गलत संख्यात्मक तुलना देता है।
समाधान: CAST() फ़ंक्शन
स्ट्रिंग को संख्यात्मक प्रकार में बदलने के लिए CAST() का उपयोग करें, फिर तुलना करें।
सिंटैक्स
SELECT * FROM yourTableName WHERE CAST(yourColumnName AS SIGNED) = yourIntegerValue;
व्यावहारिक उदाहरण
टेबल बनाना और स्ट्रिंग संख्या डालना
mysql> CREATE TABLE compareTwoStringDemo (UserId VARCHAR(100));
mysql> INSERT INTO compareTwoStringDemo VALUES
-> ('1083745'), ('9867585'), ('3547483'), ('9845646'), ('9876532');
स्ट्रिंग तुलना (गलत)
mysql> SELECT * FROM compareTwoStringDemo WHERE UserId = '3547483';
यह काम करता है क्योंकि सटीक स्ट्रिंग मिलान है।
समस्या: रेंज तुलना
-- स्ट्रिंग तुलना: '9' > '1000000' (वर्णानुक्रम में सही, संख्यात्मक रूप से गलत) SELECT * FROM compareTwoStringDemo WHERE UserId > '5000000';
CAST के साथ सही संख्यात्मक तुलना
mysql> SELECT * FROM compareTwoStringDemo
-> WHERE CAST(UserId AS SIGNED) = 3547483;
परिणाम
+---------+ | UserId | +---------+ | 3547483 | +---------+
CAST विकल्प
| प्रकार | विवरण | रेंज |
|---|---|---|
| SIGNED | हस्ताक्षरित पूर्णांक | -2147483648 से 2147483647 |
| UNSIGNED | अहस्ताक्षरित पूर्णांक | 0 से 4294967295 |
| DECIMAL | दशमलव संख्या | सटीक दशमलव |
| CHAR | स्ट्रिंग | N वर्ण |
आधुनिक विकल्प: + 0 ट्रिक
SELECT * FROM compareTwoStringDemo WHERE UserId + 0 = 3547483;
MySQL स्वचालित रूप से स्ट्रिंग को संख्या में बदल देता है जब अंकगणितीय संक्रिया की जाती है।
सर्वोत्तम अभ्यास
- संख्यात्मक डेटा के लिए हमेशा संख्यात्मक डेटा प्रकार (INT, DECIMAL) का उपयोग करें
- स्ट्रिंग में संख्या संग्रहीत करना डिज़ाइन त्रुटि है
- माइग्रेशन के दौरान CAST का उपयोग करें, स्थायी समाधान के लिए नहीं