उत्तर
intvalue = 1 उपयोग करें। स्टेटमेंट intvalue = '1' आंतरिक रूप से MySQL द्वारा CAST('1' AS INT) में कन्वर्ट हो जाता है।
उदाहरण: टेबल बनाना और डेटा डालना
mysql> CREATE TABLE DemoTable1566 (
-> intvalue INT
-> );
Query OK, 0 rows affected (0.64 sec)
mysql> INSERT INTO DemoTable1566 VALUES(1);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable1566 VALUES(55);
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO DemoTable1566 VALUES(75);
Query OK, 1 row affected (0.32 sec)
mysql> INSERT INTO DemoTable1566 VALUES(90);
Query OK, 1 row affected (0.19 sec)
सभी रिकॉर्ड देखना
mysql> SELECT * FROM DemoTable1566;
आउटपुट:
+----------+
| intvalue |
+----------+
| 1 |
| 55 |
| 75 |
| 90 |
+----------+
4 rows in set (0.00 sec)
intvalue = 1 क्वेरी
mysql> SELECT * FROM DemoTable1566 WHERE intvalue = 1;
आउटपुट:
+----------+
| intvalue |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
intvalue = '1' क्वेरी
mysql> SELECT * FROM DemoTable1566 WHERE intvalue = '1';
आउटपुट:
+----------+
| intvalue |
+----------+
| 1 +
+----------+
1 row in set (0.00 sec)
व्याख्या
- दोनों क्वेरीज समान परिणाम देती हैं क्योंकि MySQL स्वचालित प्रकार रूपांतरण (implicit type conversion) करता है
intvalue = '1'→ MySQL आंतरिक रूप सेCAST('1' AS SIGNED)करता है- परिणाम समान होता है, लेकिन
intvalue = 1अधिक कुशल और स्पष्ट है
प्रदर्शन अंतर
- संख्यात्मक तुलना (intvalue = 1): इंडेक्स उपयोग कर सकता है, तेज
- स्ट्रिंग तुलना (intvalue = '1'): प्रत्येक पंक्ति के लिए प्रकार रूपांतरण, इंडेक्स उपयोग नहीं कर सकता (कुछ मामलों में)
सर्वोत्तम अभ्यास
- संख्यात्मक कॉलम के लिए संख्यात्मक लिटरल उपयोग करें:
WHERE id = 123 - स्ट्रिंग कॉलम के लिए स्ट्रिंग लिटरल उपयोग करें:
WHERE name = 'John' - तिथि कॉलम के लिए तिथि लिटरल:
WHERE dt = '2023-01-01' - एप्लिकेशन कोड में: पैरामीटर बाइंडिंग उपयोग करें (प्रकार सुरक्षा स्वचालित)
जब स्ट्रिंग तुलना समस्या बनती है
-- VARCHAR कॉलम पर
WHERE varchar_col = 123 -- पूर्ण टेबल स्कैन (प्रकार बेमेल)
WHERE varchar_col = '123' -- इंडेक्स उपयोग कर सकता है
सही प्रकार का लिटरल उपयोग करना प्रदर्शन और शुद्धता दोनों के लिए महत्वपूर्ण है।