关系数据库的表结构由列组成,列指明了要存储的数据的含义,同时指明了要存储的数据的类型,因此,在定义表结构时,必然要指明每个列的数据类型。
每个数据库厂商提供的数据库管理系统所支持的数据类型并不完全相同,而且与标准的SQL也有些差异,这里介绍MySQL数据库管理系统支持的常用数据类型。
1.整数类型
整数类型是数据库中最基本的数据类型。MySQL支持的整数类型除了标准SQL语言支持的INTEGER和SMALLINT外,还扩展了TINYINT、MEDIUMINT和BIGINT。表4-2列出了MySQL支持的整数类型,其中INT和INTEGER两个整数类型是同名词,可以互换。
表4-2 MySQL支持的整数类型
MySQL支持在INT类型中指定整数值的显示位数,其方法是在类型关键字后面添加括号,并在括号内指定整数值的显示位数。例如,INT(5)表示显示位数为5。
对INT( n ),有以下两种情况:
1)若整数值的长度超过 n ,则按实际长度显示。
2)若整数值的长度小于 n ,则前边补0。该项功能必须与ZEROFILL修饰符一起使用才有效果。
例如,若某表C1列的数据类型定义如下:
C1 INT(5)ZEROFILL,
则当给C1列插入数值123时,C1列该数值的显示值为00123;当给C1列插入数值123456时,C1列该数值的显示值为123456。
2.小数类型
小数类型包括浮点数类型和定点数类型。浮点数类型数据是在计算机中不一定都能精确表示的小数类型。定点数类型数据是在计算机中能够精确存储的小数类型。浮点数类型有两种,单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。定点数类型只有一种:DECIMAL(可以简写为DEC)。
表4-3列出了MySQL支持的浮点数类型和定点数类型。
表4-3 MySQL支持的浮点数类型和定点数类型
浮点数类型中的 M 表示总共的数字位数; D 表示小数点后的数字位数。 M 的取值范围为1~255, D 的取值范围为1~30。 M 和 D 是可选的,如果省略了 M 和 D ,则FLOAT和DOUBLE类型将被保存为硬件所支持的最大精度。
1.文本字符串和二进制字符串
字符串类型用于存储字符串数据,字符串由汉字、英文字母、数字和各种符号等组成。MySQL支持两类字符串数据:文本字符串和二进制字符串。文本字符串可以进行区分或不区分大小写的串的比较,也可以进行模式匹配查找。二进制字符串类型的字段主要用于存储由“0”和“1”组成的字符串,从某种意义上讲,二进制字符串类型的数据是一种特殊格式的字符串。表4-4列出了MySQL支持的文本字符串类型,表4-5列出了MySQL支持的二进制字符串类型。
表4-4 MySQL支持的文本字符串类型
(续)
表4-5 MySQL支持的二进制字符串类型
二进制字符串类型与文本字符串类型的区别在于,文本字符串类型的数据以字符为单位进行存储,因此存在多种字符集、多种字符序;而二进制字符串类型中,除了BIT类型的数据是以位为单位进行存储外,其他二进制字符串类型的数据均以字节为单位进行存储,仅存在二进制字符集。
说明:
1)MySQL中的字符串常量一般用单引号括起来,比如‘计算机学院’。
2)固定长度的字符串类型表示不管实际字符需要多少空间,系统分配固定的字节数。如果空间未被占满,系统将自动用空格填充。可变长度的字符串类型表示按实际字符需要的空间进行分配。
MySQL还提供了两个特有类型:ENUM和SET,下边分别介绍这两个数据类型。
2.ENUM类型
ENUM类型是一个字符串对象,由若干子字符串常量的枚举值构成。当创建表时,如果为某列指定了ENUM类型,则该列的值必须是ENUM列表中指定的某个值。
在创建表时为列指定ENUM类型的语法格式为:
字段名ENUM(′值1′,′值2′,…,′值n′)
ENUM枚举列表中最多可以有65535个成员。ENUM类型的字段只允许一次从枚举集合中选取一个值,这有点类似于单选按钮的功能。
例如,若有如下定义的字段:
C1 ENUM(′a′,′b′,′c′,′d′)
则C1列的值只能是{′a′,′b′,′c′,′d′}四个值中的某一个。
ENUM列表中的枚举值在内部有一个索引值(用整数表示),索引值从1开始编号。例如,对上边C1列的定义,′a′的索引值是1,′b′的索引值是2,以此类推。
ENUM值按照索引顺序排列,并且空字符串排在非空字符串之前,NULL排在其他所有枚举值之前。ENUM类型的字段还有一个默认值。如果将ENUM列声明为NULL,则NULL为该字段的一个有效值,并且默认值为NULL。如果ENUM列声明为NOT NULL,其默认值为索引列表的第1个元素。
3.SET类型
与ENUM类型类似,SET类型也是一个字符串对象,可以有零或多个值。
在创建表时为列指定SET类型的语法格式为:
SET(′值1′,′值2′,…,′值n′)
SET对象中最多可以有64个值(或称为成员)。SET与ENUM最大的区别是:SET一次可以选取多个成员,而ENUM一次只能选一个。
例如,若有如下定义的字段:
C1 SET(′a′,′b′,′c′,′d′)
则C1列的值可以是:′a′、′a,b′、′a,b,d′、′a,b,c,d′、…。
与ENUM类型相同,SET列表中的每一个值都有一个索引编号,索引编号用整数表示。
注意:
1)如果在SET类型的字段中插入的值有重复,则MySQL会自动删除重复的值。例如对上例,如果为C1列插入′a,d,d′值,则C1列的实际值为′a,d′。
2)在SET类型的字段中插入的值的顺序不重要,MySQL会在存入数据库的时候,按照定义的顺序显示。例如,对上例,如果为C1列插入′a,d,b′,则查看C1列数据时,显示的是′a,b,d′。
3)如果插入了不正确的值,比如为上例的C1列插入′a,x′,在默认情况下,MySQL将给出错误信息,并且不插入该数据。
表4-6列出了MySQL支持的常用日期时间数据类型。
表4-6 MySQL常用的日期时间类型
从形式上来看,MySQL日期类型的表示方法与字符串的表示方法相同(使用单引号括起来),但本质上,MySQL日期类型的数据是一个数值类型,可以参与简单的加、减运算。每一个类型都有合法的取值范围,当插入不合法的值时,系统会将“0”值插入到字段中。
TIMESTAMP和DATETIME除了存储字节和支持的范围不同之外,还有一个最大的区别:DATETIME在存储日期数据时,按实际输入的格式存储,和所在的时区无关;而TIMESTAMP的存储是以UTC(协调世界时)格式保存,存储时对当前时区进行转换,检索时再转换回当前时区。在进行查询时,根据使用者所在时区不同,显示的日期时间值是不同的。