标识符该不该加引号
表名、列名与保留字撞车时必须加引用符,两种数据库用的符号不同:MySQL 用反引号,PostgreSQL 用双引号。更值得注意的是引号带来的语义变化——PostgreSQL 里加双引号的名字严格保留大小写,不加引号的名字一律折叠成小写,因此建表时用了大写,之后每次查询都必须带着引号。MySQL 的名字大小写行为则取决于底层文件系统与相关参数设置。
基本信息
| 适用平台 | MySQL 8.0 / PostgreSQL 12 及以上 |
|---|---|
| MySQL 引用符 | 反引号;调整为 ANSI 模式后双引号也可用于标识符 |
| PostgreSQL 引用符 | 双引号;未加引号的名字折叠为小写 |
| 保留字冲突 | 表列名与保留字同名时必须加引用符 |
| 最佳实践 | 命名避开保留字、避免大小写混用,能不加就不加 |
典型使用场景
- 表名与保留字撞车,例如 order、group 这类常见词
- 从其他系统导入的库表名带大写字母或驼峰命名
- 跨库迁移时核对名字是否一致,避免找不到对象
- 代码生成器输出带引号的语句,需要确认引号类型是否正确
- 评审建表语句时统一命名规范,减少长期维护成本
两库引用方式
两库引用方式
-- MySQL:用反引号引用标识符
SELECT `order`, `group` FROM `t_order`;
-- PostgreSQL:用双引号引用标识符
SELECT "order", "Group" FROM t_order;
-- PostgreSQL:加引号后严格区分大小写,不加则折叠为小写
-- 下面两个名字在 PostgreSQL 里是不同的对象:
-- "userName" ← 保留大写
-- username ← 折叠为全小写
-- 建表时用了大写,之后查询必须一直带引号,否则找不到对象
-- CREATE TABLE t ("userId" bigint);
-- SELECT "userId" FROM t;引用规则对照
| 项目 | MySQL | PostgreSQL |
|---|---|---|
| 标识符引用符 | 反引号 | 双引号 |
| 双引号含义 | 默认是字符串常量 | 是标识符引用符 |
| 未加引号的字母 | 大小写行为受配置与文件系统影响 | 一律折叠为小写 |
| 加引号后 | 按原样解析 | 严格保留大小写 |
| 保留字冲突 | 必须加引用 | 必须加引用 |
两种数据库互抄 SQL 时最容易踩的就是引号:MySQL 里双引号默认是字符串,PostgreSQL 里双引号是标识符;反过来把反引号抄到 PostgreSQL 会直接语法报错。跨库脚本建议统一用不带引号的规范命名。
MySQL 的表名大小写行为受底层文件系统与相关配置影响,同一套建表脚本在开发机与服务器上表现可能不同。团队规范里统一小写加下划线能规避这类环境差异。