Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL अनपेक्षित परिणाम:एक वर्चर कॉलम पर इन-क्लॉज (संख्या, 'स्ट्रिंग')

आपकी अभिव्यक्ति है:

where varCharColumn in (-1, '')

सूची में लगातार प्रकार होने चाहिए। पहला तत्व कहता है "यह पूर्णांकों की एक सूची है", इसलिए दूसरा मान एक पूर्णांक में परिवर्तित हो जाता है। और '' हो जाता है 0

वास्तव में, कोई भी अल्फ़ान्यूमेरिक स्ट्रिंग जो एक गैर-अंक से शुरू होती है, उसे भी 0 . में बदल दिया जाता है एक पूर्णांक तुलना के लिए। तो, आपके पास यह स्थिति है

'A' in (0)   --> TRUE
'B' in (0)   --> TRUE
'A' in ('B') --> FALSE

आप इसके साथ आसानी से इसका परीक्षण कर सकते हैं:

select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');

आप इसे एक कॉलम के साथ क्रिया में देख सकते हैं:

select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t

यह सच, झूठा, सच लौटाता है। हालांकि, ध्यान दें कि val in (-1, 'B') इस मामले में FALSE लौटाता है। MySQL रिक्त स्ट्रिंग को वास्तविक स्ट्रिंग से अलग व्यवहार कर रहा है, शायद दस्तावेज़ीकरण के साथ असंगत है।

कॉलम के साथ यह सच है कि किसके द्वारा प्रदर्शित किया जाता है:

select val in (0)
from (select 'A' as val) t;

किसने कहा कि तर्क मजेदार नहीं हो सकता?

इसे ठीक करने के लिए, संख्याओं के चारों ओर सिंगल कोट्स लगाकर सूची को सभी सुसंगत प्रकार का बनाएं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पायथन मुद्दा:vcvarsall.bat को खोजने में असमर्थ

  2. क्या क्रॉस-टेबल इंडेक्सिंग संभव है?

  3. JDBC MySQL के साथ बैचिंग/फ़ेच-साइज़ चुनें

  4. MySQL में सभी तालिकाओं के लिए सभी कॉलम के नाम कैसे प्राप्त करें?

  5. स्थानीय मशीन से AWS पर MySQL से कनेक्ट करें