SQL 列名不区分大小写,除非引用,标准规定标识符应规范化为大写,但PostgreSQL 规范化为小写:
引用标识符也使其区分大小写,而未引用的名称总是折叠为小写。例如,标识符FOO
、foo
和"foo"
被 PostgreSQL 认为是相同的,但"Foo"
和"FOO"
与这三个和彼此不同。(PostgreSQL 中将不带引号的名称折叠为小写与 SQL 标准不兼容,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
, 你就会遇到同样的问题:你必须在任何引用它们的 SQL 中将它们全部双引号。IP
Username
Reason
Length
最佳实践是使用小写的列名和表名,这样您就不必一直担心引用内容。我建议您将表修复为使用小写的列名。
顺便说一句,您的'NULL'
字符串文字:
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
看起来很奇怪,你确定你不是这个意思"Username" is null
吗?'NULL'
字符串文字和 NULL 值是完全不同的东西,您不能使用=
或将其!=
与 NULL 进行比较,当 NULL 可能在起作用时,您必须使用is null
, is not null
, is distinct from
, oris not distinct from
(取决于您的意图)。