Bisakah PostgreSQL membuat database case sensitif?

10

Saya porting beberapa kode dari beberapa versi Sybase ke PostgreSQL. Ini adalah aplikasi C yang menggunakan pustaka klien Sybase. Pendekatan saya adalah menulis lapisan terjemahan yang menerjemahkan panggilan dbsqlexec()ke PQexec()(misalnya). Bagian itu sebagian besar berfungsi.

Tampaknya basis data Sybase diatur dengan cara case-sensitive (berkenaan dengan nama objek basis data). Misalnya, ada WIDGETtabel dan widgettabel. Sepertinya konvensi dalam aplikasi ini adalah bahwa semua huruf besar menunjukkan tabel data aktual, sedangkan nama huruf kecil digunakan sebagai tabel sementara ketika menjalankan beberapa pemrosesan.

Menurut 4.1 Lexical Structure , " Kata-kata kunci dan tanda pengenal yang tidak dikutip tidak peka huruf besar-kecil. " Saya tahu bahwa saya dapat menggandakan tanda kutip pengidentifikasi untuk menonaktifkan lipat otomatis ke huruf kecil, tetapi saya tidak ingin harus melakukannya secara manual melalui zillions garis kode yang menggunakan database ini.

Apakah ada cara untuk mengatur PostgreSQL untuk menonaktifkan lipat kasus otomatis ini untuk pengidentifikasi objek database?

Alternatif saya adalah menulis beberapa kode yang memeriksa setiap pernyataan SQL dan menempatkan tanda kutip ganda di setiap pengidentifikasi (yang bukan kata kunci).

Greg Hewgill
sumber
Kata kunci dapat digunakan sebagai pengidentifikasi jika dikutip ganda - meskipun Anda tidak harus melakukannya. Bagaimanapun, Anda tidak dapat memastikan bahwa beberapa pengidentifikasi dari basis kode Sybase Anda bukan kata kunci dalam PostgreSQL. Semua lebih banyak alasan untuk pengidentifikasi kutipan ganda atau, lebih disukai, ganti nama itu.
Erwin Brandstetter
pengidentifikasi tanpa tanda kutip di postgres sebenarnya tidak peka sama sekali, mereka diperlakukan sebagai semua huruf kecil. jadi tAbLeNaMe akan mencocokkan satu tabel yang disebut tablename tetapi tidak satu yang disebut tableName. Saya akan mengganti nama tabel karena kalau tidak, orang akan lupa "dan akhirnya mengakses versi huruf kecil karena kesalahan.
JamesRyan
@ JamesRyan: itu salah. select * from TaBlEnAmEakan mereferensikan tabel yang sama dengan select * from tablenameatauselect * from TABLENAME
a_horse_with_no_name
@a_horse_with_no_name: Jika Anda create table "tableName" (id integer primary key);, lalu create table "tablename" (id integer primary key);permintaan ini select * from TaBlEnAmE;akan memilih dari "tablename", bukan dari "tableName". "Nama yang tidak dikutip selalu dilipat menjadi huruf kecil" .
Mike Sherrill 'Cat Recall'

Jawaban:

3

Saya akhirnya menulis beberapa kode yang mengubah SQL yang dihasilkan oleh aplikasi menjadi SQL yang kompatibel dengan PostgreSQL. Cukup mudah:

  • Pisahkan pernyataan menjadi token yang masuk akal, lewati string string yang dikutip tunggal
  • Kutip dua kali segala sesuatu yang bukan kata kunci atau angka

Saya juga memanfaatkan lapisan ini untuk mengubah panggilan isnullmenjadi coalesce. Sejauh ini berhasil dengan cukup baik.

Greg Hewgill
sumber
saya menggunakan tanda kutip ("blahblablah") untuk membuatnya case sensitif .. berfungsi dengan baik untuk saya ..
Anuj Patel
1

Apakah ada cara untuk mengatur PostgreSQL untuk menonaktifkan lipat kasus otomatis ini untuk pengidentifikasi objek database?

Tidak secara langsung. Anda mungkin dapat membuat perubahan yang relatif kecil ke kode sumber PostgreSQL , dan mengkompilasi ulangnya. (Mulai di src / backend / parser / parser.c?) Tapi saya akan terkejut jika itu sangat sederhana.

Mike Sherrill 'Cat Recall'
sumber
Saya lebih suka tidak main-main dengan kode sumber, karena itu akan memerlukan perubahan khusus pada instalasi PostgreSQL setiap kali ada perubahan (host, versi, dll), dan instalasi biner tidak akan tersedia.
Greg Hewgill