आपकी अभिव्यक्ति है:
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;
किसने कहा कि तर्क मजेदार नहीं हो सकता?
इसे ठीक करने के लिए, संख्याओं के चारों ओर सिंगल कोट्स लगाकर सूची को सभी सुसंगत प्रकार का बनाएं।