2012-05-13 36 views
37

Khi tôi đã bỏ ra hàng giờ để gỡ lỗi một truy vấn SQL đơn giản bằng cách sử dụng mysql_query() trong PHP/MySQL chỉ để nhận ra rằng tôi đã bỏ lỡ bactick xung quanh tên bảng. Từ đó tôi đã luôn luôn sử dụng nó xung quanh tên bảng.Tiêu chuẩn SQL nói gì về việc sử dụng backtick (`)?

Nhưng khi tôi sử dụng giống nhau trong SQLite/C++, biểu tượng thậm chí không được nhận dạng. Đó là khó hiểu, cho dù sử dụng này hay không? Tiêu chuẩn nói gì về việc sử dụng nó?

Ngoài ra, sẽ rất hữu ích nếu có ai có thể cho tôi biết khi nào sử dụng dấu ngoặc kép và khi nào thì không. Ý tôi là xung quanh các giá trị và tên trường.

Trả lời

67

Chuẩn SQL (phiên bản hiện tại là ISO/IEC 9075: 2011, trong nhiều phần) không nói gì về ký hiệu 'back-tick' hoặc 'back-quote' (Unicode U + 0060 hoặc GRAVE ACCENT); nó không nhận ra nó như một nhân vật có ý nghĩa đặc biệt có thể xuất hiện trong SQL.

Cơ chế tiêu chuẩn SQL cho trích dẫn định danh là với định kích thước xác định kèm theo trong dấu ngoặc kép:

SELECT "select" FROM "from" WHERE "where" = "group by"; 

Trong MySQL, mà có thể được viết:

SELECT `select` FROM `from` WHERE `where` = `group by`; 

Trong MS SQL Server, đó có thể là được viết:

SELECT [select] FROM [from] WHERE [where] = [group by]; 

Sự cố với ký hiệu chuẩn SQL là C lập trình được sử dụng để kèm theo các chuỗi trong dấu nháy kép, vì vậy hầu hết DBMS sử dụng dấu ngoặc kép như là một thay thế cho các dấu nháy đơn được công nhận theo tiêu chuẩn. Nhưng điều đó sau đó khiến bạn gặp vấn đề khi bạn muốn kèm theo số nhận dạng.

Microsoft đã thực hiện một cách tiếp cận; MySQL đã khác; Informix cho phép sử dụng hoán đổi đơn và kép, nhưng nếu bạn muốn định danh phân tách, bạn đặt biến môi trường và sau đó bạn phải tuân theo tiêu chuẩn (dấu nháy đơn cho chuỗi, dấu ngoặc kép cho số nhận dạng); DB2 chỉ theo tiêu chuẩn, AFAIK; SQLite dường như tuân theo tiêu chuẩn; Oracle cũng xuất hiện theo tiêu chuẩn; Sybase xuất hiện để cho phép dấu ngoặc kép (chuẩn) hoặc dấu ngoặc vuông (như với MS SQL Server — có nghĩa là SQL Server cũng có thể cho phép dấu ngoặc kép). Điều này page tài liệu tất cả các máy chủ này (và hữu ích điền vào những khoảng trống trong kiến ​​thức của tôi), và lưu ý xem các chuỗi bên trong định danh phân cách có phân biệt chữ hoa chữ thường hay không.


Khi sử dụng cơ chế trích dẫn xung quanh số nhận dạng, thái độ của tôi là 'không bao giờ'. Vâng, không hoàn toàn không bao giờ, nhưng chỉ khi hoàn toàn buộc phải làm như vậy.

Lưu ý rằng số nhận dạng được phân tách phân biệt chữ hoa chữ thường; nghĩa là, "from""FROM" tham chiếu đến các cột khác nhau (trong hầu hết DBMS — xem URL ở trên). Hầu hết SQL không phân biệt chữ hoa chữ thường; nó là một mối phiền toái để biết trường hợp nào cần sử dụng. (Tiêu chuẩn SQL có một định hướng máy tính lớn là — nó hy vọng các tên được chuyển đổi thành chữ hoa, mặc dù hầu hết DBMS chuyển đổi tên thành chữ thường.)

Nói chung, bạn phải phân định số nhận dạng là từ khóa cho phiên bản SQL bạn đang sử dụng. Điều đó có nghĩa là hầu hết các từ khóa trong Standard SQL, cộng với bất kỳ phần bổ sung nào là một phần của (các) việc triển khai cụ thể mà bạn đang sử dụng.

Một nguồn tiếp tục gặp sự cố là nâng cấp, trong đó tên cột không phải là từ khóa trong phiên bản N trở thành từ khóa trong bản phát hành N + 1. SQL hiện tại đã hoạt động trước khi nâng cấp ngừng hoạt động sau đó. Sau đó, ít nhất là một biện pháp ngắn hạn, bạn có thể bị buộc phải trích dẫn tên. Nhưng trong quá trình thông thường của các sự kiện, bạn nên nhắm đến việc tránh báo giá trị nhận dạng.

Tất nhiên, thái độ của tôi được tô điểm bởi thực tế là Informix (đó là những gì tôi làm việc với hầu hết) chấp nhận SQL này đúng nguyên văn, trong khi hầu hết các DBMS sẽ nghẹt thở trên đó:

CREATE TABLE TABLE 
(
    DATE INTEGER NOT NULL, 
    NULL FLOAT NOT NULL, 
    FLOAT INTEGER NOT NULL, 
    NOT  DATE NOT NULL, 
    INTEGER FLOAT NOT NULL 
); 

Tất nhiên, người những người sản xuất một bảng vô lý cho bất cứ điều gì khác hơn là mục đích trình diễn nên được treo, rút ​​ra, quý và sau đó các dư lượng nên được thực hiện để sửa chữa các mess họ đã tạo ra. Tuy nhiên, trong một số giới hạn mà khách hàng thường xuyên quản lý để đạt được, từ khóa có thể được sử dụng làm định danh trong nhiều ngữ cảnh. Đó là, của chính nó, một hình thức hữu ích của tương lai-proofing. Nếu một từ trở thành từ khóa, có cơ hội vừa phải rằng mã hiện tại sẽ tiếp tục hoạt động không bị ảnh hưởng bởi thay đổi. Tuy nhiên, cơ chế không hoàn hảo; bạn không thể tạo một bảng với một cột có tên là PRIMARY, nhưng bạn có thể thay đổi một bảng để thêm một cột như vậy. Có một lý do cho sự riêng tư, nhưng rất khó để giải thích.

+5

+1 Câu trả lời về bách khoa toàn thư – Bohemian

+0

Mặc dù tôi không nhất thiết phải đồng ý, tôi thích câu trả lời này rất nhiều và nó bổ sung nhiều vào kiến ​​thức của tôi, cảm ơn +1. Tôi vẫn sẽ tiếp tục sử dụng backticks mặc dù! :) Tôi lo lắng hơn về nhiều chương trình cũ đột nhiên không hoạt động hơn là phải chuyển các truy vấn vào một hàm chuyển đổi thay thế backticks bằng [và] ** nếu ** tôi thay đổi cơ sở dữ liệu .. – FrancescoMM

Các vấn đề liên quan