3.2 SQL
数据定义
数据库中的关系集合必须由数据定义语言(DDL
)指定给系统。SQL
的DDL
不仅能够定义一组关系,还能够定义每个关系的信息,包括:
- 每个关系的模式。
- 每个属性的取值类型。
- 完整性约束。
- 每个关系维护的索引集合。
- 每个关系的安全性和权限信息。
- 每个关系在磁盘上的物理存储结构。
3.2.1 基本类型
SQL
标准支持多种固有类型,包括:
数据类型 | 描述 |
---|---|
char(n) |
固定长度的字符串,用户指定长度n 。也可以使用全称character |
varchar(n) |
可变长度的字符串,用户指定最大长度n ,等价于全称character varying |
int |
整数类型(和机器相关的整数的有限子集),等价于全称integer |
smallint |
小整数类型(和机器相关的整数类型的子集) |
numeric(p,d) |
定点数,精度由用户指定。这个数有p 位数字(加上一个符号位),其中d 位数字在小数点右边。所以在一个这种类型的字段上, numeric(3,1) 可以精确储存44.5 ,但不能精确存储444.5 或0.32 这样的数。 |
real,double precision |
浮点数 与双精度浮点数 ,精度与机器相关 |
float(n) |
精度至少为n 位的浮点数。 |
更多类型将在4.5节介绍
空值
每种类型都可能包含一个被称作空值
的特殊值。空值表示一个缺失的值,该值可能存在但并不为人所知,或者可能根本不存在。在可能的情况下,我们希望禁止加入空值。
char
和varchar
的区别
char
数据类型存放固定长度的字符串。例如,属性A的类型是char(10)
。如果我们为此属性存入字符串”XYZ
“,那么该字符串后会追加7个空格来使其达到10个字符的串长度。
反之,如果属性B的类型是varchar(10)
,我们在属性B中存入字符串”XYZ
“,则不会增加空格。
两个char比较时会自动补空格
比较两个char
类型的值时,如果它们的长度不同,在比较之前会自动在短值
后面加上额外的空格以使它们的长度一致
有些数据库系统在char
和varchar
比较时会自动加空格 有些不
当比较一个char
类型和一个varchar
类型的时候,也许读者会期望在比较之前会自动在varchar
类型后面加上额外的空格以使长度一致;
然而,这种情况可能发生也可能不发生,这取决于数据库系统。其结果是,即便上述属性A和B中存放的是相同的值”XYZ
“,A=B
的比较也可能返回假。
建议使用varchar
我们建议始终使用varchar
类型而不是char
类型来避免这样的问题。
原文链接: 3.2 SQL数据定义 3.2.1 基本类型