2011-10-24 17 views
15

मैं कुछ परीक्षण कर रहा था, और जब मैं एक टेबल से पूछताछ कर रहा था तो यह आश्चर्यचकित था, और क्वेरी SELECT * FROM table WHERE email=0 तालिका से सभी पंक्तियों को वापस कर दिया।mySQL सभी पंक्तियों को वापस करता है जब फ़ील्ड = 0

इस तालिका में कोई '0' मान नहीं है और यह नियमित ई-मेल के साथ पॉप्युलेट किया गया है।

ऐसा क्यों होता है? इससे गंभीर सुरक्षा समस्याएं हो सकती हैं।

क्या क्वेरी को संशोधित किए बिना इसे टालने का कोई तरीका है?

क्या मुझे यहां कुछ याद आ रही है?

धन्यवाद।

उत्तर

21

ऐसा इसलिए है क्योंकि यह ईमेल फ़ील्ड को परिवर्तित कर रहा है (जो मुझे लगता है कि एक वर्चर फ़ील्ड है) एक पूर्णांक में। वैध पूर्णांक के बिना कोई भी क्षेत्र 0 के बराबर होगा। आपको यह सुनिश्चित करना चाहिए कि आप केवल स्ट्रिंग फ़ील्ड की तुलना स्ट्रिंग मानों से करें (तिथियों की तुलना में, तारीखों की तुलना में)। प्रश्न निम्नानुसार होना चाहिए।

SELECT * FROM table WHERE email='0'; 
+3

आपको लगता है कि mysql इस तरह से काम किया जाना चाहिए? मुझे लगता है कि यह वह जगह है जहां बग पेश करना आसान है। मुझे नहीं लगता कि इसे ऐसा करने की ज़रूरत क्यों है जैसे किसी भी स्ट्रिंग को 0 में परिवर्तित करने जैसे समझने वाले रूपांतरण नहीं। 0 को '0' में परिवर्तित करने के लिए बेहतर क्यों नहीं है - इससे अधिक समझदारी होगी –

6

आपका email स्तंभ एक CHAR या VARCHAR प्रकार है। जब आप email = 0 की स्थिति का उपयोग करते हैं, तो MySQL email कॉलम की सामग्री को आपके द्वारा प्रदान की गई 0 के साथ तुलना करने के लिए एक पूर्णांक में कास्टिंग कर रहा है। यदि आपने अपने 0 उद्धरणों में घिरा हुआ था, तो क्वेरी अपेक्षित के रूप में काम करेगी। (email = '0')

MySQL में एक पूर्णांक के लिए एक गैर-अंकीय स्ट्रिंग परिवर्तित 0.

mysql> SELECT CAST('[email protected]' AS SIGNED); 
+-------------------------------------+ 
| CAST('[email protected]' AS SIGNED) | 
+-------------------------------------+ 
|         0 | 
+-------------------------------------+ 

इसके विपरीत में परिणाम होगा, यदि आप सांख्यिक तार के साथ एक ही बात का प्रयास किया, वे सही ढंग से डाली हो सकता है:

mysql> SELECT CAST('12345' AS SIGNED); 
+-------------------------+ 
| CAST('12345' AS SIGNED) | 
+-------------------------+ 
|     12345 | 
+-------------------------+ 
-1

आप सभी रिकॉर्ड, जिसमें ईमेल कॉलम खाली या रिक्त नहीं होना चाहिए प्राप्त करने के लिए चाहते हैं, तो आप उपयोग कर सकते

SELECT * FROM table WHERE email IS NOT NULL; 
3

ईमेल फ़ील्ड शायद वर्ण है और आप संख्यात्मक मान से मेल खाते हैं।

साथ प्रयास करें,

SELECT * FROM table WHERE email='0'; 
संबंधित मुद्दे