2012-11-16 3 views
5

Tôi đang cố gắng làm quen với Postgres (9.2) sau một chút công bằng của việc sử dụng MySQL (5.1), vì tôi đã bị một số ít MySQL's gotchas cắn. Tuy nhiên, trong vòng năm phút đầu tiên của tôi với Postgres tôi chạy vào một trong its gotchas, mà tôi chắc chắn rằng tất cả mọi người hits:Tại sao PostgreSQL mặc định mọi thứ trong trường hợp thấp hơn?

  • Theo mặc định, PostgreSQL chuyển đổi tất cả mọi thứ mà không được trích dẫn sang chữ thường.

Đây không phải là quá lớn của một thỏa thuận với tôi, vì có một vài cách giải quyết rõ ràng:

  • đóng gói tất cả mọi thứ trong dấu ngoặc kép.
  • Cho phép mọi thứ được đặt tên theo kiểu chữ thường.

Nhưng tôi tự hỏi tại sao. Xem xét bao nhiêu tranh chấp tôi tưởng tượng ra quyết định thiết kế này gây ra, tôi ngạc nhiên rằng tôi không thể tìm thấy bất kỳ lý do trên internet. Có ai có một lời giải thích kỹ lưỡng, hoặc tốt hơn là một liên kết đến một số tuyên ngôn nhà phát triển, là tại sao Postgres được thiết kế theo cách này? Tôi quan tâm.

+0

Bạn có hỏi về điều này không? http://stackoverflow.com/questions/153944/is-sql-syntax-case-sensitive?rq=1 –

+3

AFAIK, tiêu chuẩn cho biết rằng số nhận dạng không được bỏ phiếu nên được xếp thành trường hợp trên, [PostgreSQL gấp thành chữ thường] (http : //stackoverflow.com/a/8736088/479863) thay thế. Gấp để trên hoặc dưới trường hợp không nên quan trọng trừ khi bạn chỉ trích dẫn định danh của bạn đôi khi, nhưng nếu bạn đang làm điều đó thì bạn xứng đáng những gì bạn nhận được. Bạn được chào đón để 'tạo bảng Pancakes (...)' và 'select * từ Pancakes', chỉ cần không' tạo bảng "Pancakes" (...) 'và cố gắng' chọn * từ Pancakes'. MySQL mọi người dường như có thói quen kỳ quặc của backtick-trích dẫn tất cả mọi thứ, mất thói quen đó. –

+0

@muistooshort Tôi thường nhìn thấy các tuyên bố rằng thông số SQL không xác định xem trường hợp gấp phải là trường hợp trên hay thấp hơn, chỉ rằng nó phải xảy ra. Bạn có biết nơi nó được chỉ định để gấp vào trường hợp đặc biệt? (Tôi đang tìm kiếm tài liệu tham khảo nhưng không tìm thấy nhiều đó là hữu ích vào lúc này). –

Trả lời

6

Tiêu chuẩn SQL chỉ định số nhận dạng không được xếp hạng gấp cho chữ hoa. Nhiều RDBMS khác theo tiêu chuẩn theo cách này. Cả Firebird và Oracle đều làm. Điều này có nghĩa là khớp với số nhận dạng, theo mặc định, không phân biệt chữ hoa chữ thường. Hành vi này là rất quan trọng khi nói đến khả năng tương thích trong các truy vấn cơ bản. Về vấn đề này hành vi của MySQL là một ngoại lệ thực sự.

Tuy nhiên PostgreSQL lệch khỏi tiêu chuẩn bằng cách gấp thành chữ thường. Có những lý do chung tại sao điều này được coi là dễ đọc hơn, v.v. vì bạn có thể sử dụng trường hợp cho cú pháp cuing. Một cái gì đó như:

SELECT foo FROM bar WHERE baz = 1; 

Điều này là tự nhiên hơn khi các trường hợp được gấp xuống thấp hơn. Các gấp đối diện thay thế sẽ là:

select FOO from BAR where BAZ = 1; 

Nói chung giống như các hành vi cũ (gấp để chữ thường) bởi vì nó nhấn mạnh đến hoạt động sql tốt hơn trong khi gấp để các trường hợp khác de-nhấn mạnh các hoạt động và nhấn mạnh đến định danh. Do sự phức tạp của nhiều truy vấn, tôi nghĩ rằng trước đây hoạt động tốt hơn.

Nói chung, hầu hết các cuộc thảo luận mà tôi đã thấy trên danh sách gửi thư bưu chính đã được mọi người đồng ý rằng hành vi bắt buộc chuẩn bị hỏng. vì vậy ở trên là sự hiểu biết của tôi về các vấn đề.

+0

Tôi không hiểu ngữ cảnh của dòng “Về vấn đề này, hành vi của MySQL là một ngoại lệ thực sự”. Ý của bạn là 'Postgres' thay vì 'MySQL'? Hoặc là ở đây một số bối cảnh khác cho 'MySQL' mà tôi bị mất? –

+0

Tham chiếu đến gotchas MySQL và PostgreSQL gotchas. –