SQL कॉलम नाम केस असंवेदनशील होते हैं जब तक कि उद्धृत नहीं किया जाता है, मानक कहता है कि पहचानकर्ताओं को ऊपरी मामले में सामान्यीकृत किया जाना चाहिए, लेकिन PostgreSQL लोअर केस को सामान्य करता है:
<ब्लॉकक्वॉट>
एक पहचानकर्ता को उद्धृत करना भी इसे केस-संवेदी बनाता है, जबकि गैर-उद्धृत नाम हमेशा लोअर केस में जोड़ दिए जाते हैं। उदाहरण के लिए, पहचानकर्ता FOO
, foo
, और "foo"
PostgreSQL द्वारा समान माना जाता है, लेकिन "Foo"
और "FOO"
इन तीनों और एक दूसरे से भिन्न हैं। (पोस्टग्रेएसक्यूएल में गैर-उद्धृत नामों को लोअर केस में फोल्ड करना SQL मानक के साथ असंगत है, जो कहता है कि गैर-उद्धृत नामों को अपर केस में फोल्ड किया जाना चाहिए। इस प्रकार, foo
"FOO"
. के बराबर होना चाहिए नहीं "foo"
मानक के अनुसार। यदि आप पोर्टेबल एप्लिकेशन लिखना चाहते हैं तो आपको सलाह दी जाती है कि आप हमेशा किसी विशेष नाम को उद्धृत करें या इसे कभी भी उद्धृत न करें।)
आप Email
का संदर्भ दे रहे हैं आपके SQL में:
SELECT "bans".* FROM "bans" WHERE (Email='' ...
लेकिन PostgreSQL Email
के बारे में शिकायत कर रहा है :
column "email" does not exist
आपका गैर-उद्धृत Email
Email
. के रूप में व्यवहार किया जा रहा है क्योंकि PostgreSQL पहचानकर्ताओं को कम मामले में सामान्य करता है। ऐसा लगता है कि आपने कॉलम को बड़े अक्षरों में डबल कोट करके बनाया है:
create table "bans" (
"Email" varchar(...)
...
)
या :Email
. का उपयोग करके माइग्रेशन में कॉलम की पहचान करने के लिए। यदि आप कॉलम नाम को बनाते समय उद्धृत करते हैं, तो इसे लोअर केस (या SQL मानक केस में अपर केस) के लिए सामान्यीकृत नहीं किया जाता है और आपको इसे डबल कोट करना होगा और केस को हमेशा के लिए मैच करना होगा:
SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
एक बार जब आप Email
को ठीक कर लेते हैं , आपको IP
. के साथ भी यही समस्या होगी , Username
, Reason
, और Length
:आपको उन सभी को किसी भी SQL में दोहराना होगा जो उनका संदर्भ देता है।
सबसे अच्छा अभ्यास लोअर केस कॉलम और टेबल नामों का उपयोग करना है ताकि आपको हर समय चीजों को उद्धृत करने की चिंता न करनी पड़े। मेरा सुझाव है कि आप अपनी तालिका को छोटे अक्षरों में कॉलम नाम रखने के लिए ठीक करें।
एक तरफ, आपका 'NULL'
स्ट्रिंग शाब्दिक:
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
अजीब लग रहा है, क्या आप सुनिश्चित हैं कि आपका मतलब यह नहीं है "Username" is null
? 'NULL'
स्ट्रिंग अक्षर और NULL मान पूरी तरह से अलग चीजें हैं और आप =
. का उपयोग नहीं कर सकते हैं या !=
NULL से चीजों की तुलना करने के लिए, आपको is null
का उपयोग करना होगा , is not null
, is distinct from
, या is not distinct from
(आपके इरादे के आधार पर) जब NULLs चलन में हो।