1

以下两个查询有区别吗?

CREATE TABLE alpha(age INTEGER);

CREATE TABLE alpha("age" INTEGER);

我读到数据库对象是不区分大小写,除非它们用引号引起来。当我尝试将 TABLE 对象保留在引号中但不适用于属性时,这适用。

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

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

4

2 回答 2

2

有区别吗?是的。

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

CREATE TABLE alpha(age INTEGER);

oracle 会将该列和表以大写形式存储在数据字典中。

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

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

于 2013-04-13T01:14:38.603 回答
1

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

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

于 2013-04-13T00:28:45.390 回答