该文章曾发表于新浪博客【http://blog.sina.com.cn/s/blog_9e1c7dc50102vwrv.html】,今天(2018-06-12)翻看之前的文档(有些博客我是整理成TXT保存起来的),重读了本篇博客,又是不由会心一笑,所以就拿过来,放到自己的博客系统里。如下即是正文。

首先创建表

create table sample(
	id number(10) ,
	title varchar2(20),
	createUser varchar2(20)
);

用plsql查看生成的表,字段全为大写了,重点看下createUser,无论创建语句中的字段为大写或小写,后成表后都变成大写了。 这个时候使用select id,title,createUser from sample可以发现返回的列全是大写的。

若使用

create table sample2(
	"id" number(10) ,
	"title" varchar2(20),
	"createUser" varchar2(20)
);

再次查看发现字段全是引号中的大小写形式,同样注意createUser字段。但再次使用select id,title,createUser from sample2来查询表,会从后往前报无效的标识符。但是严格按创建时的字段大小写书写,即改为select "id","title","createUser" from sample2就可以使用。

和同事探讨一下,最终一致达成的说法为: createUser和"createUser"的保存方式是不一样的,对于前者,oracle会自动将字段名转换成大写保存(具体为什么转成大写就不清楚了),而对于后者,既保存了引号中的字面形式也保存了引号(即引号和字段名加在一起做为字段名),但这种引号只能放在两边[1]。

说明: [1]:至于为什么,设想我们想使一个字段为TItLE,得使用语句

create table sample3(
	"id" number(10) ,
	ti"t"le varchar2(20),
	"createUser" varchar2(20)
);

很遗憾,想法很好,但此路不通。 另外我们不使用引号定义字段时不能给字段加*,即语句

create table sample4(
	id number(10) ,
	title* varchar2(20),
	createUser varchar2(20)
);

是不合法的。但加上引号就能用了。即

create table sample5(
	"id" number(10) ,
	"title*" varchar2(20),
	"createUser" varchar2(20)
);

更令人惊讶的是,下面的语句竟也合法:

create table sample6(
	"id" number(10) ,
	"title*&^%@!\-=+" varchar2(20),
	"createUser" varchar2(20)
);

更无语的是,下面的语句也合法:

create table sample6(
	id number(10) ,
	title$# varchar2(20),
	createUser varchar2(20)
);

看来,是得找本相关的书看看了。连这些基础都一知半解。