SQLの列名は、引用符で囲まれていない限り大文字と小文字を区別しません。標準では、識別子は大文字に正規化する必要がありますが、PostgreSQLは小文字に正規化する必要があります。
識別子を引用すると大文字と小文字が区別されますが、引用符で囲まれていない名前は常に小文字になります。たとえば、識別子FOO
、、、foo
およびは"foo"
PostgreSQLによって同じであると見なされますが、これら3つ"Foo"
および"FOO"
互いに異なります。(PostgreSQLで引用符で囲まれていない名前を小文字に折りたたむことはSQL標準と互換性がありません。つまり、引用符で囲まれていない名前は大文字に折りたたむ必要があります。したがって、標準に従わないfoo
ことと同等である必要があります。ポータブルアプリケーションを作成する場合は、常に特定の名前を引用するか、決して引用しないことをお勧めします。)"FOO"
"foo"
SQLで参照Email
しています:
SELECT "bans".* FROM "bans" WHERE (Email='' ...
しかし、PostgreSQLは次のことについて不平を言っていますemail
:
column "email" does not exist
引用符で囲まれていないものは、PostgreSQLが識別子を小文字に正規化するためEmail
として扱われます。email
大文字の名前で列を二重引用符で囲んで作成したようです。
create table "bans" (
"Email" varchar(...)
...
)
または、を使用:Email
して移行の列を識別します。列名を作成時に引用符で囲むと、小文字(またはSQL標準の場合は大文字)に正規化されないため、二重引用符で囲み、大文字と小文字を完全に一致させる必要があります。
SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
を修正すると、、、、および:でEmail
同じ問題が発生します。それらを参照するSQLでは、それらすべてを二重引用符で囲む必要があります。IP
Username
Reason
Length
ベストプラクティスは、小文字の列名とテーブル名を使用することです。これにより、常に引用符で囲む必要がなくなります。小文字の列名を持つようにテーブルを修正することをお勧めします。
余談ですが、'NULL'
文字列リテラルは次のとおりです。
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
奇妙に見えます、あなたはあなたが意味しないと確信しています"Username" is null
か?'NULL'
文字列リテラルとNULL値はまったく異なるものであり、NULLを使用したり、NULLと比較したりすることはできません。NULLが機能している可能性がある場合は、、、、、または(意図に応じて)を使用する必要=
があります。!=
is null
is not null
is distinct from
is not distinct from