咨询Doctrine ORM中标识符引用的定义、禁用原因及替代方案
关于Doctrine中“Don't use identifier quoting”的疑问解答
1. 什么是标识符引用?
数据库里的表名、列名、索引名这类名称都属于标识符。当你的标识符和SQL关键字(比如order、select)重名,或者包含空格、连字符这类特殊字符时,就需要用特定符号把标识符包裹起来,让数据库把它识别成普通名称而非关键字/特殊语法,这就是标识符引用。不同数据库的引用符号不一样:比如MySQL用反引号`,PostgreSQL用双引号",SQL Server用方括号[]。
2. 为什么Doctrine不推荐使用?
- 跨库兼容性差:不同数据库的标识符引用规则和符号存在差异,开启引用后,你的代码或查询可能在MySQL里正常运行,但切换到PostgreSQL就报错,大幅增加数据库迁移的成本。
- 不必要的性能损耗:数据库解析带引用的标识符时,需要额外处理符号和语法逻辑,单次损耗虽小,但大量查询累积下来会产生可感知的性能影响。
- 代码可读性下降:到处都是引用符号会让SQL语句显得杂乱,增加后续维护的理解成本。
- 易养成不良命名习惯:依赖标识符引用的话,你可能会随意用关键字或特殊字符命名,导致数据库结构不规范,埋下长期维护的隐患。
3. 替代方案
- 避开SQL关键字:不要用
order、group这类关键字当表/列名,改用orders、customer_order这类语义清晰的名称。 - 用下划线分隔单词:如果需要多词命名,用下划线代替空格或连字符,比如用
user_name代替user name或user-name,这样不需要引用就能被数据库正常识别。 - 遵循统一命名规范:比如表名用小写复数形式(
users、products),列名用小写+下划线,保持整个数据库结构的命名一致性。
SQL查询示例
不推荐(使用标识符引用)
MySQL环境下的查询,因为order是SQL关键字,必须用反引号引用:
SELECT `id`, `user_name`, `order` FROM `user` WHERE `user`.`id` = 5;
推荐(不使用标识符引用)
调整命名后,无需任何引用,且跨数据库通用:
SELECT id, user_name, order_number FROM users WHERE users.id = 5;
内容的提问来源于stack exchange,提问作者Hevyweb
相关产品推荐
相关产品推荐

