Backticks được sử dụng cho mã định danh bảng và cột, nhưng chỉ cần thiết khi mã định danh là từ khóa dành riêng cho MySQL hoặc khi mã định danh chứa các ký tự khoảng trắng hoặc ký tự nằm ngoài một bộ giới hạn (xem bên dưới) Nên tránh sử dụng từ khóa dành riêng như định danh cột hoặc bảng khi có thể, tránh vấn đề trích dẫn.
Dấu ngoặc đơn nên được sử dụng cho các giá trị chuỗi như trong VALUES()
danh sách. Báo giá kép cũng được MySQL hỗ trợ cho các giá trị chuỗi, nhưng các trích dẫn đơn được RDBMS khác chấp nhận rộng rãi hơn, do đó, nên sử dụng các trích dẫn đơn thay vì gấp đôi.
MySQL cũng mong đợi DATE
và DATETIME
các giá trị theo nghĩa đen sẽ được trích dẫn đơn dưới dạng chuỗi như thế nào '2001-01-01 00:00:00'
. Tham khảo tài liệu Văn học Ngày và Giờ để biết thêm chi tiết, đặc biệt là các lựa chọn thay thế cho việc sử dụng dấu gạch nối -
làm dấu phân cách trong chuỗi ngày.
Vì vậy, bằng cách sử dụng ví dụ của bạn, tôi sẽ trích dẫn hai chuỗi PHP và sử dụng các trích dẫn đơn trên các giá trị 'val1', 'val2'
. NULL
là một từ khóa MySQL và một giá trị đặc biệt (không) và do đó không được trích dẫn.
Không có định danh bảng hoặc cột nào trong số này là các từ dành riêng hoặc sử dụng các ký tự yêu cầu trích dẫn, nhưng dù sao tôi cũng đã trích dẫn chúng bằng các backticks (sẽ nói thêm về điều này sau ...).
Các hàm có nguồn gốc từ RDBMS (ví dụ, NOW()
trong MySQL) không nên được trích dẫn, mặc dù các đối số của chúng phải tuân theo cùng một chuỗi hoặc các quy tắc trích dẫn định danh đã được đề cập.
Backtick (`)
bảng & cột ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ Giới thiệu
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$ query = " XÁC NHẬN VÀO` bảng` (`id`,` col1`, `col2`,` date`, `update`)
GIÁ TRỊ (NULL, 'val1', 'val2', '2001-01-01', NOW ()) ";
↑ ↑ ↑ ↑↑↑↑↑
Từ khóa không được trích dẫn ─────┴┴┴┘ │ │ │ │
Các chuỗi trích dẫn đơn (') ───────────┴────┴──┴────┘
Đơn trích dẫn (') NGÀY ───────────────────────────┴──────────┘ │
Chức năng không được trích dẫn ─────────────────────────────────────────┴┴┴┴┘
Nội suy biến
Các mẫu trích dẫn cho các biến không thay đổi, mặc dù nếu bạn có ý định nội suy các biến trực tiếp trong một chuỗi, thì nó phải được trích dẫn kép trong PHP. Chỉ cần đảm bảo rằng bạn đã thoát đúng các biến để sử dụng trong SQL. ( Nên sử dụng API hỗ trợ các câu lệnh được chuẩn bị thay thế, để bảo vệ chống lại việc tiêm SQL ).
// Điều tương tự với một số thay thế biến
// Ở đây, một tên bảng biến $ bảng được trích dẫn ngược và các biến
// trong danh sách GIÁ TRỊ được trích dẫn đơn
$ query = " XÁC NHẬN VÀO` $ bảng` (`id`,` col1`, `col2`,` date`) VALUES (NULL, '$ val1' , '$ val2' , '$ date' ) ";
Báo cáo đã chuẩn bị
Khi làm việc với các báo cáo đã chuẩn bị, hãy tham khảo tài liệu để xác định xem có giữ chỗ của tuyên bố hay không. Các API phổ biến nhất có sẵn trong PHP, PDO và MySQLi, mong đợi các trình giữ chỗ không được trích dẫn , cũng như các API câu lệnh được chuẩn bị sẵn trong các ngôn ngữ khác:
// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
Các ký tự yêu cầu trích dẫn backtick trong định danh:
Theo tài liệu của MySQL , bạn không cần trích dẫn (backtick) số nhận dạng bằng cách sử dụng bộ ký tự sau:
ASCII: [0-9,a-z,A-Z$_]
(chữ cái Latinh cơ bản, chữ số 0-9, đô la, gạch dưới)
Bạn có thể sử dụng các ký tự ngoài bộ được đặt làm định danh bảng hoặc cột, bao gồm cả khoảng trắng chẳng hạn, nhưng sau đó bạn phải trích dẫn (backtick) chúng.
"tablename"
, và dấu nháy đơn là cho literals, ví dụ'this is a some text'
. Back-tick không bao giờ được sử dụng trong SQL tiêu chuẩn. (Nếu bạn cần bao gồm một trích dẫn kép trong một mã định danh, hãy nhập nó hai lần như"odd""tablename"
vậy. Tương tự, trích dẫn hai lần bằng chữ, như'Conan O''Brien'
.)