3.2 SQL数据定义 3.2.1 基本类型

3.2 SQL数据定义

数据库中的关系集合必须由数据定义语言(DDL)指定给系统。SQLDDL不仅能够定义一组关系,还能够定义每个关系的信息,包括:

  • 每个关系的模式。
  • 每个属性的取值类型。
  • 完整性约束。
  • 每个关系维护的索引集合。
  • 每个关系的安全性和权限信息。
  • 每个关系在磁盘上的物理存储结构。

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.50.32这样的数。
real,double precision 浮点数双精度浮点数,精度与机器相关
float(n) 精度至少为n位的浮点数。

更多类型将在4.5节介绍

空值

每种类型都可能包含一个被称作空值的特殊值。空值表示一个缺失的值,该值可能存在但并不为人所知,或者可能根本不存在。在可能的情况下,我们希望禁止加入空值。

charvarchar的区别

char数据类型存放固定长度的字符串。例如,属性A的类型是char(10)。如果我们为此属性存入字符串”XYZ“,那么该字符串后会追加7个空格来使其达到10个字符的串长度。
反之,如果属性B的类型是varchar(10),我们在属性B中存入字符串”XYZ“,则不会增加空格

两个char比较时会自动补空格

比较两个char类型的值时,如果它们的长度不同,在比较之前会自动在短值后面加上额外的空格以使它们的长度一致

有些数据库系统在charvarchar比较时会自动加空格 有些不

当比较一个char类型和一个varchar类型的时候,也许读者会期望在比较之前会自动在varchar类型后面加上额外的空格以使长度一致;
然而,这种情况可能发生也可能不发生,这取决于数据库系统。其结果是,即便上述属性A和B中存放的是相同的值”XYZ“,A=B的比较也可能返回假。

建议使用varchar

我们建议始终使用varchar类型而不是char类型来避免这样的问题。