Tên cột SQL không phân biệt chữ hoa chữ thường trừ khi được trích dẫn, tiêu chuẩn nói rằng các mã định danh nên được chuẩn hóa thành chữ hoa nhưng PostgreSQL chuẩn hoá thành chữ thường:
Trích dẫn một số nhận dạng cũng làm cho nó phân biệt chữ hoa chữ thường, trong khi các tên không được trích dẫn luôn được xếp thành chữ thường. Ví dụ:các số nhận dạng
FOO
,foo
và"foo"
được coi là giống nhau bởi PostgreSQL, nhưng"Foo"
và"FOO"
khác với ba cái này và lẫn nhau. (Việc gấp các tên chưa được trích dẫn thành chữ thường trong PostgreSQL không tương thích với tiêu chuẩn SQL, điều này nói rằng các tên chưa được trích dẫn phải được xếp thành chữ hoa. Do đó,foo
phải tương đương với"FOO"
không phải"foo"
theo tiêu chuẩn. Nếu bạn muốn viết các ứng dụng di động, bạn nên luôn trích dẫn một tên cụ thể hoặc không bao giờ trích dẫn nó.)
Bạn đang tham khảo Email
trong SQL của bạn:
SELECT "bans".* FROM "bans" WHERE (Email='' ...
nhưng PostgreSQL đang phàn nàn về email
:
column "email" does not exist
Email
chưa được trích dẫn của bạn đang được coi là email
bởi vì PostgreSQL chuẩn hóa số nhận dạng thành chữ thường. Có vẻ như bạn đã tạo các cột có tên viết hoa bằng cách trích dẫn kép chúng:
create table "bans" (
"Email" varchar(...)
...
)
hoặc bằng cách sử dụng :Email
để xác định cột trong quá trình di chuyển. Nếu bạn trích dẫn một tên cột khi nó được tạo, thì nó không được chuẩn hóa thành chữ thường (hoặc chữ hoa trong trường hợp chuẩn SQL) và bạn sẽ phải trích dẫn kép nó và khớp với trường hợp này mãi mãi:
SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
Sau khi bạn sửa Email
, bạn sẽ gặp vấn đề tương tự với IP
, Username
, Reason
và Length
:bạn sẽ phải trích dẫn kép tất cả chúng trong bất kỳ SQL nào tham chiếu đến chúng.
Cách tốt nhất là sử dụng tên cột và bảng viết thường để bạn không phải lo lắng về việc trích dẫn mọi thứ mọi lúc. Tôi khuyên bạn nên sửa bảng của mình để có các tên cột viết thường.
Ngoài ra, 'NULL'
của bạn chuỗi ký tự:
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
trông kỳ lạ, bạn có chắc rằng bạn không có nghĩa là "Username" is null
? 'NULL'
chuỗi ký tự và giá trị NULL hoàn toàn khác nhau và bạn không thể sử dụng =
hoặc !=
để so sánh mọi thứ với NULL, bạn phải sử dụng is null
, is not null
, is distinct from
hoặc is not distinct from
(tùy thuộc vào ý định của bạn) khi NULL có thể được phát.