PostgreSQL có thể tạo một cơ sở dữ liệu phân biệt chữ hoa chữ thường không?


10

Tôi đang chuyển một số mã từ một số phiên bản Sybase sang PostgreSQL. Đây là một ứng dụng C sử dụng thư viện máy khách Sybase. Cách tiếp cận của tôi là viết một lớp dịch để dịch các cuộc gọi dbsqlexec()sang PQexec()(ví dụ). Phần đó chủ yếu là làm việc.

Dường như cơ sở dữ liệu Sybase được thiết lập theo cách phân biệt chữ hoa chữ thường (đối với tên đối tượng cơ sở dữ liệu). Ví dụ, có cả WIDGETbảng và widgetbảng. Có vẻ như quy ước trong ứng dụng này là các tên viết hoa chỉ ra các bảng dữ liệu thực tế, trong khi các tên chữ thường được sử dụng làm bảng tạm thời khi chạy một số xử lý.

Theo 4.1 Cấu trúc từ vựng , " Các từ khóa và số nhận dạng không được trích dẫn không phân biệt chữ hoa chữ thường. " Tôi biết rằng tôi có thể trích dẫn hai số định danh để vô hiệu hóa tính năng gập tự động thành chữ thường, nhưng tôi không muốn thực hiện điều đó một cách thủ công thông qua hàng trăm dòng mã sử dụng cơ sở dữ liệu này.

Có cách nào để thiết lập PostgreSQL để vô hiệu hóa trường hợp gấp tự động này cho các định danh đối tượng cơ sở dữ liệu không?

Cách thay thế của tôi sẽ là viết một số mã kiểm tra từng câu lệnh SQL và đặt dấu ngoặc kép xung quanh mỗi mã định danh (đó không phải là từ khóa).


Từ khóa có thể được sử dụng làm định danh nếu được trích dẫn kép - mặc dù bạn không nên làm điều đó. Trong mọi trường hợp, bạn không thể chắc chắn rằng một số số nhận dạng từ cơ sở mã Sybase của bạn không có từ khóa trong PostgreQuery. Tất cả lý do nhiều hơn để trích dẫn hai định danh hoặc tốt nhất là đổi tên chúng.
Erwin Brandstetter

định danh không được trích dẫn trong postgres thực sự không phải là trường hợp không nhạy cảm, chúng được coi là tất cả các trường hợp thấp hơn. vì vậy tAbLeNaMe sẽ khớp với một bảng duy nhất được gọi là tablename nhưng không phải là một bảng được gọi là tên bảng. Tôi sẽ đổi tên các bảng vì nếu không mọi người sẽ quên "và cuối cùng truy cập vào phiên bản chữ thường.
JamesRyan

@JamesRyan: sai rồi. select * from TaBlEnAmEsẽ tham chiếu cùng bảng với select * from tablenamehoặcselect * from TABLENAME
a_horse_with_no_name

@a_horse_with_no_name: Nếu bạn create table "tableName" (id integer primary key);, và sau create table "tablename" (id integer primary key);đó truy vấn select * from TaBlEnAmE;này sẽ chọn từ "tablename", không phải từ "tên bảng". "Tên không được trích dẫn luôn được gấp lại thành chữ thường" .
Mike Sherrill 'Nhớ lại mèo'

Câu trả lời:


3

Cuối cùng tôi đã viết một số mã biến đổi SQL được tạo bởi ứng dụng thành SQL tương thích với PostgreSQL. Nó khá đơn giản:

  • Chia câu lệnh thành các mã thông báo hợp lý, bỏ qua chuỗi ký tự đơn trích dẫn
  • Trích dẫn bất cứ điều gì không phải là một từ khóa hoặc số

Tôi cũng đã tận dụng lớp này để chuyển đổi các cuộc gọi isnullđến coalesce. Cho đến nay nó hoạt động khá tốt.


tôi sử dụng dấu ngoặc kép ("blahblablah") để làm cho trường hợp nhạy cảm .. nó hoạt động trơn tru đối với tôi ..
Anuj Patel

1

Có cách nào để thiết lập PostgreSQL để vô hiệu hóa trường hợp gấp tự động này cho các định danh đối tượng cơ sở dữ liệu không?

Không trực tiếp. Bạn thể thực hiện một thay đổi tương đối nhỏ đối với mã nguồn PostgreSQL và biên dịch lại nó. (Bắt đầu bằng src / backend / Parser / Parser.c?) Nhưng tôi sẽ ngạc nhiên nếu nó rất đơn giản.


Tôi không muốn gây rối với mã nguồn, vì điều đó sẽ yêu cầu thay đổi tùy chỉnh đối với cài đặt PostgreSQL mỗi khi có bất kỳ thay đổi nào (máy chủ, phiên bản, v.v.) và cài đặt nhị phân sẽ không khả dụng.
Greg Hewgill
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.