SQLの列名では、引用符で囲まれていない限り大文字と小文字は区別されません。標準では、識別子は大文字に正規化する必要がありますが、PostgreSQLでは小文字に正規化されます:
識別子を引用すると大文字と小文字が区別されますが、引用符で囲まれていない名前は常に小文字になります。たとえば、識別子
FOO
、foo
、および"foo"
PostgreSQLでは同じと見なされますが、"Foo"
および"FOO"
これらの3つとは異なります。 (PostgreSQLで引用符で囲まれていない名前を小文字に折りたたむことは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 distinct from
と区別されません (意図によって異なります)NULLが機能している可能性がある場合。