Oracle同一命名空间中大小写标识符(含引号)使用的矛盾疑问
关于Oracle同一命名空间中带/不带引号标识符的冲突问题
这完全不矛盾,你只是对文档里的两个描述的适用场景理解有点偏差——咱们把Oracle的标识符规则拆碎了说就清楚了:
先明确Oracle的核心规则(对应你提到的文档第9点)
未加引号的标识符不区分大小写,Oracle将其解释为大写。加引号的标识符区分大小写。
翻译成大白话:
- 如果你写不带引号的标识符,比如
employees或者EMPLOYEES,Oracle都会自动把它转成全大写的EMPLOYEES来存储和识别——所以这俩在Oracle眼里完全是同一个东西。 - 如果你写带双引号的标识符,比如
"employees"、"Employees"、"EMPLOYEES",Oracle会严格按照你写的大小写原样存储,这三个是完全独立的不同标识符。
再解释你提到的两个部分
部分1:为什么employees、"employees"、"Employees"、"EMPLOYEES"看起来能共存?
这里你可能误解了:不带引号的employees和带引号的"EMPLOYEES"其实是不能共存的,文档里的部分1真正想表达的是:
- 不带引号的
employees(被Oracle转成EMPLOYEES),可以和带引号的小写"employees"、带引号的混合大小写"Employees"共存——因为这三个的实际存储名称分别是EMPLOYEES、employees、Employees,完全不一样。 - 但不带引号的
employees和带引号的"EMPLOYEES"是绝对不能共存的,因为它们的实际存储名称都是EMPLOYEES,Oracle会认为是同一个对象。
部分2:为什么employees、EMPLOYEES、"EMPLOYEES"被视为相同?
这个很好理解:
employees和EMPLOYEES都是不带引号的标识符,Oracle自动转成EMPLOYEES,所以是同一个。"EMPLOYEES"是带引号的全大写标识符,它的存储名称就是EMPLOYEES,和前两个转成后的名称完全一致——所以这三个在Oracle眼里是同一个对象,自然不能在同一命名空间里重复创建。
总结一下
核心就是:不带引号的标识符最终都会变成全大写,所以只要某个带引号的标识符是全大写的,它就和对应的不带引号标识符冲突;但带引号的非全大写标识符,就和不带引号的标识符完全不冲突,可以共存。
内容的提问来源于stack exchange,提问作者Henry Yang
相关产品推荐
相关产品推荐

