Trong MySQL, **backticks (`)** dùng để phân định identifier (tên bảng, cột, database) khi tên trùng với từ khóa dự trữ (reserved words) hoặc chứa ký tự đặc biệt.
Khi nào BẮT BUỘC dùng backticks
| Trường hợp | Ví dụ | Lý do |
|---|---|---|
| Tên là từ khóa SQL | SELECT * FROM `table` WHERE `where` = 1 | table, where, select, order, group, key, index... |
| Chứa khoảng trắng | `ten cot` | Không hợp lệ nếu không quote |
| Chứa ký tự đặc biệt | `cot#1`, `user-name` | Ký tự không phải chữ/số/_ |
| Bắt đầu bằng số | `123cot` | Identifier không được bắt đầu bằng số |
Ví dụ minh họa
1. Tạo bảng KHÔNG dùng backticks với từ khóa - LỖI
mysql> CREATE TABLE table ( where INT );
ERROR 1064 (42000): You have an error in your SQL syntax...
near 'table ( where int )' at line 1
2. Tạo bảng CÓ backticks - THÀNH CÔNG
mysql> CREATE TABLE `table` ( `where` INT );
Query OK, 0 rows affected (0.55 sec)
3. Chèn và truy vấn dữ liệu
INSERT INTO `table`(`where`) VALUES(1), (100), (1000);
SELECT * FROM `table` WHERE `where` = 100;
Kết quả:
+-------+
| where |
+-------+
| 100 |
+-------+
Khi nào KHÔNG cần backticks
- Tên chỉ chứa chữ cái, số, gạch dưới (_), không bắt đầu bằng số
- Không trùng từ khóa reserved word
- Ví dụ:
users,user_name,order_items,t1
Best Practice
- Luôn dùng backticks trong code production, migration script, stored procedure → An toàn tuyệt đối
- Các ORM/Query Builder (Laravel Eloquent, Doctrine, Hibernate) tự động thêm backticks
- Khi viết thủ công ad-hoc query đơn giản: có thể bỏ qua nếu tên "sạch"
Danh sách từ khóa thường gặp cần backticks
SELECT, INSERT, UPDATE, DELETE, WHERE, FROM, JOIN, LEFT, RIGHT, INNER,
ORDER, GROUP, BY, HAVING, LIMIT, OFFSET, TABLE, INDEX, KEY, PRIMARY,
UNIQUE, FOREIGN, REFERENCES, CHECK, CONSTRAINT, TRIGGER, VIEW, PROCEDURE,
FUNCTION, DATABASE, SCHEMA, USER, PASSWORD, LOCK, UNLOCK, COMMIT, ROLLBACK
Lưu ý về ANSI_QUOTES mode
Nếu bật SET SQL_MODE='ANSI_QUOTES', dấu nháy kép " cũng dùng làm identifier quote (giống backticks). Khi đó chuỗi ký tự phải dùng nháy đơn '.