Nama kolom SQL tidak peka huruf besar/kecil kecuali jika dikutip, standar mengatakan bahwa pengidentifikasi harus dinormalisasi menjadi huruf besar tetapi PostgreSQL dinormalisasi menjadi huruf kecil:
Mengutip pengidentifikasi juga membuatnya peka huruf besar/kecil, sedangkan nama yang tidak dikutip selalu dilipat menjadi huruf kecil. Misalnya, pengidentifikasi
FOO
,foo
, dan"foo"
dianggap sama oleh PostgreSQL, tetapi"Foo"
dan"FOO"
berbeda dari ketiganya dan satu sama lain. (Pelipatan nama yang tidak dikutip menjadi huruf kecil di PostgreSQL tidak sesuai dengan standar SQL, yang mengatakan bahwa nama yang tidak dikutip harus dilipat menjadi huruf besar. Jadi,foo
harus sama dengan"FOO"
bukan"foo"
sesuai standar. Jika Anda ingin menulis aplikasi portabel, Anda disarankan untuk selalu mengutip nama tertentu atau tidak pernah mengutipnya.)
Anda mereferensikan Email
di SQL Anda:
SELECT "bans".* FROM "bans" WHERE (Email='' ...
tetapi PostgreSQL mengeluh tentang email
:
column "email" does not exist
Email
Anda yang tidak dikutip sedang diperlakukan sebagai email
karena PostgreSQL menormalkan pengidentifikasi menjadi huruf kecil. Sepertinya Anda membuat kolom dengan nama yang dikapitalisasi dengan mengutip dua kali:
create table "bans" (
"Email" varchar(...)
...
)
atau dengan menggunakan :Email
untuk mengidentifikasi kolom dalam migrasi. Jika Anda mengutip nama kolom saat dibuat, maka itu tidak dinormalisasi menjadi huruf kecil (atau huruf besar dalam huruf standar SQL) dan Anda harus mengutipnya dua kali dan mencocokkan huruf besar selamanya:
SELECT "bans".* FROM "bans" WHERE ("Email"='' ...
Setelah Anda memperbaiki Email
, Anda akan memiliki masalah yang sama dengan IP
, Username
, Reason
, dan Length
:Anda harus menggandakan kutipan semuanya dalam SQL apa pun yang mereferensikannya.
Praktik terbaik adalah menggunakan nama kolom dan tabel dengan huruf kecil sehingga Anda tidak perlu khawatir tentang mengutip sesuatu sepanjang waktu. Sebaiknya perbaiki tabel Anda agar memiliki nama kolom huruf kecil.
Sebagai tambahan, 'NULL'
your string literal:
SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^
terlihat aneh, apakah Anda yakin tidak bermaksud "Username" is null
? 'NULL'
string literal dan nilai NULL adalah hal yang sama sekali berbeda dan Anda tidak dapat menggunakan =
atau !=
untuk membandingkan sesuatu dengan NULL, Anda harus menggunakan is null
, is not null
, is distinct from
, atau is not distinct from
(tergantung pada niat Anda) saat NULL mungkin dimainkan.