Identifier Quoting ใน MySQL
ใน MySQL ใช้ Backtick (`) เพื่อ Quote Identifier (ชื่อตาราง, คอลัมน์, Database, View, Stored Procedure, Alias) เพื่อให้ใช้ Reserved Keywords หรืออักขระพิเศษเป็นชื่อได้
กติกาพื้นฐาน
- Unquoted: ต้องเริ่มต้นด้วยตัวอักษหรือ _ แล้วตามด้วย ตัวอักษร ตัวเลข _ $ เท่านั้น
- Quoted (Backtick): ใส่อะไรก็ได้ รวมถึง Reserved Words, Space, Special Chars, Unicode
- ANSI_QUOTES SQL Mode: ถ้าเปิดอยู่ Double Quote (
") จะกลายเป็น Identifier Quote แทน String Quote
ตัวอย่าง: ใช้ Reserved Keywords เป็นชื่อ
-- สร้างตารางชื่อ INT (Reserved Word) มีคอลัมน์ select, varchar (Reserved Words)
CREATE TABLE `INT` (
`select` INT,
`varchar` VARCHAR(100)
);
-- Insert ต้อง Quote ทุกครั้ง
INSERT INTO `INT` VALUES(1, 'MySQL');
INSERT INTO `INT` VALUES(2, 'MongoDB');
INSERT INTO `INT` VALUES(3, 'Java');
INSERT INTO `INT` VALUES(4, 'C');
-- Select ต้อง Quote เช่นกัน
SELECT * FROM `INT`;
ผลลัพธ์:
+--------+---------+
| select | varchar |
+--------+---------+
| 1 | MySQL |
| 2 | MongoDB |
| 3 | Java |
| 4 | C |
+--------+---------+
Reserved Keywords ที่พบบ่อย (ควรหลีกเลี่ยงหรือ Quote)
SELECT, INSERT, UPDATE, DELETE, WHERE, FROM, JOIN, LEFT, RIGHT, INNER, OUTER, ORDER, BY, GROUP, LIMIT, OFFSET, INDEX, KEY, PRIMARY, UNIQUE, FOREIGN, REFERENCES, CHECK, CONSTRAINT, TRIGGER, PROCEDURE, FUNCTION, VIEW, TABLE, DATABASE, SCHEMA, INT, VARCHAR, CHAR, TEXT, DATE, TIME, TIMESTAMP, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, NOW, CURDATE, CURTIME, USER, PASSWORD, ENCRYPT, DECRYPT, AES_ENCRYPT, AES_DECRYPT, MD5, SHA1, SHA2, UUID, CONNECTION_ID, VERSION, DATABASE, SCHEMA, TABLES, COLUMNS, INDEXES, PARTITIONS, TRIGGERS, EVENTS, ROUTINES, PARAMETERS, VARIABLES, STATUS, PROCESSLIST, ENGINES, PLUGINS, CHARACTER_SETS, COLLATIONS, COLLATION_CHARACTER_SET_APPLICABILITY, ...
Best Practice
- หลีกเลี่ยง Reserved Words - ตั้งชื่อให้สื่อความหมาย ไม่ใช่ Keyword
- ใช้ Backtick ทุกครั้งในโค้ด Production - ป้องกัน Error เมื่อ MySQL Version ใหม่เพิ่ม Keyword ใหม่
- ORM/Query Builder - ควร Escape Identifier อัตโนมัติ (เช่น Laravel Eloquent, Doctrine DBAL)
- Identifier Case Sensitivity: Windows = Case Insensitive, Linux = Case Sensitive (ขึ้นกับ
lower_case_table_names)
ตัวอย่างชื่อที่ต้อง Quote
`my-table` -- มี Hyphen
`my table` -- มี Space
`123table` -- เริ่มต้นด้วยตัวเลข
`select` -- Reserved Word
`column@name` -- Special Char
`用戶表` -- Unicode (Chinese)