为何SQL中有时需用`包裹表名,有时却无需?
为什么MySQL中表名有时需要用`包裹,有时无需?
核心原因是标识符与SQL关键字冲突:
range是MySQL的保留关键字(用于范围相关的语法逻辑,比如配合BETWEEN实现范围查询),直接将它作为表名时,SQL解析器会把它当作关键字处理,而非表名,因此触发语法错误。必须用`包裹,明确告诉解析器这是一个表名标识符。range_relation只是普通的自定义标识符,和任何MySQL关键字都不冲突,所以可以直接使用,不需要额外包裹。
需要用`包裹标识符(表名、列名等)的场景:
- 标识符与MySQL的保留关键字重名时,必须包裹。
- 标识符包含特殊字符(空格、连字符
-、中文等),或者以数字开头时,需要包裹。
示例对比:
- 错误写法:
(SELECT * FROM order WHERE id=1;order是MySQL保留关键字,直接使用会报错) - 正确写法:
SELECT * FROM `order` WHERE id=1;
注:部分SQL模式(如ANSI_QUOTES)支持用双引号"代替反引号,但反引号是MySQL默认的标识符包裹方式,兼容性更强。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

