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 基本类型