Tên cột PostgreSQL có phân biệt chữ hoa chữ thường không?


157

Tôi có một bảng db nói, personstrong Postgres được lưu truyền bởi một nhóm khác có tên cột là "first_Name". Bây giờ đang cố gắng sử dụng chỉ huy PG để truy vấn bảng này trên tên cột này.

select * from persons where first_Name="xyz";

Và nó chỉ trở lại

LRI: cột "first_Name" không tồn tại

Không chắc chắn nếu tôi đang làm điều gì đó ngớ ngẩn hoặc có một cách giải quyết cho vấn đề này mà tôi đang thiếu?

Câu trả lời:


284

Tất cả các mã định danh (bao gồm cả tên cột) không được trích dẫn kép được gấp lại thành chữ thường trong PostgreQuery. Tên cột được tạo bằng dấu ngoặc kép và do đó giữ lại các chữ cái viết hoa (và / hoặc các vi phạm cú pháp khác) phải được trích dẫn hai lần cho đến hết đời: ( "first_Name")

Vì vậy, vâng , tên cột PostgreSQL phân biệt chữ hoa chữ thường:

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

Cũng sửa các dấu ngoặc kép không chính xác xung quanh 'xyz'. Các giá trị (chuỗi ký tự) được đặt trong dấu ngoặc đơn .

Đọc hướng dẫn ở đây.

Lời khuyên thường trực của tôi là chỉ sử dụng tên hợp pháp, chữ thường để trích dẫn kép là không cần thiết.


4
@ArtB: Tiêu chuẩn SQL định nghĩa các định danh không phân biệt chữ hoa chữ thường, giống như Postgres thực hiện nó. Độ lệch duy nhất: số nhận dạng không trích dẫn được gấp lại thành chữ hoa trong tiêu chuẩn, nhưng pg chữ thường mọi thứ không được trích dẫn kép. (Chỉ liên quan trong các trường hợp góc hiếm.) Chi tiết trong hướng dẫn ở đây.
Erwin Brandstetter

1
@adfs: Tôi không nghĩ rằng tôi có thể giải thích điều đó tốt hơn tôi đã làm. Để biết thêm, hãy theo liên kết đến hướng dẫn tôi đã cung cấp nhiều lần.
Erwin Brandstetter

15
@adfs: Trong SQL foobar, FOOBARFooBarlà cùng một định danh. Tuy nhiên "foobar", "FooBar""FOOBAR"là các định danh khác nhau
a_horse_with_no_name

5
@a_horse_with_no_name có, nhưng theo SQL foobarFOOBARgiống như "FOOBAR", dưới potgresql FOOBARfoobarvv đều giống như "foobar".
Jasen

1
@KamelMili: Tôi đề nghị đặt câu hỏi của bạn dưới dạng câu hỏi , cung cấp tất cả thông tin cần thiết. Bình luận không phải là nơi. Bạn luôn có thể liên kết đến câu trả lời này cho bối cảnh. Và bạn có thể để lại một bình luận với liên kết đến câu hỏi liên quan của bạn ở đây (để cũng thu hút sự chú ý của tôi).
Erwin Brandstetter

16

Để trích dẫn tài liệu :

Từ khóa và định danh không trích dẫn là trường hợp không nhạy cảm. Vì thế:

UPDATE MY_TABLE SET A = 5;

tương đương có thể được viết là:

uPDaTE my_TabLE SeT a = 5;

Bạn cũng có thể viết nó bằng cách sử dụng định danh trích dẫn :

UPDATE "my_table" SET "a" = 5;

Việc trích dẫn một mã định danh 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 gấp lại thành chữ thường (không giống như tiêu chuẩn SQL trong đó các tên không trích dẫn được gấp lại thành chữ hoa). Ví dụ, số nhận dạng FOO, foo"foo"được coi là giống nhau bởi PostgreSQL, nhưng "Foo""FOO"khác với ba và mỗi khác.

Nếu bạn muốn viết các ứng dụng di động, bạn nên luôn luôn trích dẫn một tên cụ thể hoặc không bao giờ trích dẫn nó.


8

Các tên cột là trường hợp hỗn hợp hoặc chữ hoa phải được trích dẫn kép trong PostgresQL. Vì vậy, quy ước tốt nhất sẽ là theo dõi tất cả các trường hợp nhỏ với dấu gạch dưới.


2
Điều này không chính xác theo lời giải thích được đưa ra bởi @ erwin-brandstetter
Michael Silver

9
Làm thế nào là không chính xác? Nếu bạn có tên cột là trường hợp hỗn hợp hoặc chữ hoa, để tham chiếu đến chúng, bạn cần đặt mã định danh trong dấu ngoặc kép.
theferrit32
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.