以下两个查询有区别吗?
CREATE TABLE alpha(age INTEGER);
和
CREATE TABLE alpha("age" INTEGER);
我读到数据库对象是不区分大小写的,除非它们用引号引起来。当我尝试将 TABLE 对象保留在引号中但不适用于属性时,这适用。
我猜原因是属性不是数据库对象。这个对吗?
如果是,那么属性属于哪个类别,如果不是数据库对象?
有区别吗?是的。
当您不使用引号时,例如:
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;
它取决于数据库引擎,甚至是如何配置数据库本身或连接的会话。但是,一般情况下,SQL Server会将age
and"age"
视为相同的标识符,而Oracle会将age
and"age"
视为不同的标识符。
关于属性(列),对这些标识符的处理也有很大差异。大多数数据库引擎将允许通过引号(或其他分隔符)来标识属性,并且以与处理表标识符相同的方式。