属性SQL上的引号

时间:2013-04-13 00:25:42

标签: sql oracle11g

以下两个查询之间是否存在差异?

CREATE TABLE alpha(age INTEGER);

CREATE TABLE alpha("age" INTEGER);

我读过数据库对象是 INSENSITIVE ,除非它们保留在引号中。 当我尝试将TABLE对象保留在引号中但不适用于属性时,这适用。

我猜原因是属性不是数据库对象。这是对的吗?

如果是,那么属性属于哪个类别,如果不是数据库对象?

2 个答案:

答案 0 :(得分:2)

有区别吗?是。

当您不使用引号时,例如:

CREATE TABLE alpha(age INTEGER);

oracle会将该列和表作为UPPERCASE存储在数据字典中。

换句话说,这些陈述是相同的:

CREATE TABLE alpha(age INTEGER);
CREATE TABLE "ALPHA"("AGE" INTEGER);
CREATE TABLE ALPHA(AGE INTEGER);

此外,表格中的任何后续dml / ddl如:

select age from alpha;
查找对象/列时,

首先会转换为大写;所以上面的SQL可以正常工作。即oracle将查找列AGE和表ALPHA,而不是列出的age列或表alpha

但是,当您使用带引号的标识符创建时:

CREATE TABLE alpha("age" INTEGER);

oracle会创建一个包含小写ALPHA列的表age(请查看user_tab_columns以查看此内容)。所以只有以下内容才能选择它:

select "age" from alpha;
select "age" from "ALPHA";
select "age" from ALPHA;

而不是:

select age from alpha;

例如: http://sqlfiddle.com/#!4/3084e/1

答案 1 :(得分:1)

它取决于数据库引擎,甚至数据库本身或连接的会话的配置方式。但是,通常情况下,SQL Server会将age"age"视为相同的标识符,而Oracle会将age"age"视为不同

关于属性(列),对这些标识符的处理也有很大差异。大多数数据库引擎都允许通过引号(或其他分隔符)标识属性,并以与表标识符相同的方式进行标识。