Apakah nama kolom PostgreSQL peka huruf besar-kecil?

157

Saya punya tabel db mengatakan, personsdi Postgres diturunkan oleh tim lain yang memiliki nama kolom katakan "first_Name",. Sekarang saya mencoba menggunakan komandan PG untuk menanyakan tabel ini pada nama kolom ini.

select * from persons where first_Name="xyz";

Dan itu hanya kembali

GALAT: kolom "first_Name" tidak ada

Tidak yakin apakah saya melakukan sesuatu yang konyol atau apakah ada solusi untuk masalah ini yang saya lewatkan?

5122014009
sumber

Jawaban:

284

Semua pengidentifikasi (termasuk nama kolom) yang tidak dikutip ganda dilipat ke huruf kecil di PostgreSQL. Nama kolom yang dibuat dengan tanda kutip ganda dan dengan demikian mempertahankan huruf besar (dan / atau pelanggaran sintaksis lainnya) harus dikutip ganda selama sisa hidup mereka: ( "first_Name")

Jadi, ya , nama kolom PostgreSQL peka terhadap huruf besar-kecil:

SELECT * FROM persons WHERE "first_Name" = 'xyz';

Juga perbaiki tanda kutip ganda yang salah di sekitar 'xyz'. Nilai (string literal) dilampirkan dalam tanda kutip tunggal .

Baca manualnya di sini.

Saran saya adalah menggunakan nama hukum yang lebih kecil secara eksklusif sehingga pengutipan ganda tidak diperlukan.

Erwin Brandstetter
sumber
4
@ArtB: Standar SQL mendefinisikan pengidentifikasi tidak case, seperti Postgres mengimplementasikannya. Satu-satunya penyimpangan: pengidentifikasi tanda kutip dilipat ke huruf besar dalam standar, tetapi pg huruf kecil segala sesuatu yang tidak dikutip ganda. (Hanya relevan dalam kasus sudut langka.) Detail dalam manual di sini.
Erwin Brandstetter
1
@ Adfs: Saya rasa saya tidak bisa menjelaskannya lebih baik daripada yang sudah saya lakukan. Untuk lebih lanjut, ikuti tautan ke manual yang saya berikan berulang kali.
Erwin Brandstetter
15
@ adfs: Dalam SQL foobar,, FOOBARdan FooBaradalah pengidentifikasi yang sama. Namun "foobar", "FooBar"dan "FOOBAR"merupakan pengidentifikasi yang berbeda
a_horse_with_no_name
5
@ a_horse_with_no_name ya, tetapi di bawah SQL foobardan FOOBARsama dengan "FOOBAR", di bawah potgresql FOOBARdan foobarlain-lain sama dengan "foobar".
Jasen
1
@ KamelMili: Saya sarankan untuk mengajukan pertanyaan Anda sebagai pertanyaan , memberikan semua informasi yang diperlukan. Komentar bukan tempatnya. Anda selalu dapat menautkan ke jawaban ini untuk konteks. Dan Anda dapat meninggalkan komentar dengan tautan ke pertanyaan terkait Anda di sini (untuk juga menarik perhatian saya).
Erwin Brandstetter
16

Mengutip dokumentasi :

Kata kunci dan pengidentifikasi yang tidak dikutip tidak peka huruf besar-kecil. Karena itu:

UPDATE MY_TABLE SET A = 5;

dapat dengan setara ditulis sebagai:

uPDaTE my_TabLE SeT a = 5;

Anda juga bisa menulisnya menggunakan pengenal yang dikutip :

UPDATE "my_table" SET "a" = 5;

Mengutip pengenal menjadikannya case-sensitive, sedangkan nama yang tidak dikutip selalu dilipat ke huruf kecil (tidak seperti standar SQL di mana nama yang tidak dikutip dilipat ke huruf besar). Sebagai contoh, pengidentifikasi FOO,, foodan "foo"dianggap sama oleh PostgreSQL, tetapi "Foo"dan "FOO"berbeda dari ketiga dan satu sama lain.

Jika Anda ingin menulis aplikasi portabel Anda disarankan untuk selalu mengutip nama tertentu atau tidak pernah mengutipnya.

Eugene Yarmash
sumber
8

Nama kolom yang merupakan case campuran atau huruf besar harus dikutip ganda dalam PostgresQL. Jadi konvensi terbaik akan mengikuti semua kasus kecil dengan garis bawah.

keserampangan
sumber
2
Ini tidak benar sesuai penjelasan yang diberikan oleh @ erwin-brandstetter
Michael Silver
9
Bagaimana ini salah? Jika Anda memiliki nama kolom yang campuran huruf besar atau huruf besar, untuk merujuk mereka, Anda harus memasukkan pengenal dalam tanda kutip ganda.
theferrit32