数据库中的每个表都是由一个或多个列构成的。可以用 CREATE TABLE 语句创建一个表,创建表时要为每列指定一个类型。列的类型与数据类型相对应,但是比数据类型更为具体,用列类型描述表列可能包含的值的种类以及范围,列的值必须符合规定,不能包含对应的数据类型所允许的所有值。例如,CHAR(16)就规定了存储的字符串值必须是16位。当然不是你必须存储16个字符,而是指列在表中要占16个字符的宽度的。
MySQL的列类型是一种手段,通过这种手段可以描述一个表列包含什么类型的值,这又决定了 MySQL 怎样处理这些值。例如,数值值既可用数值也可用串的列类型来存放,但是根据存放这些值的类型,MySQL 对它们的处理将会有些不同。每种列类型都有几个特性如下:
- 其中可以存放什么类型的值。
- 值要占据多少空间,以及该值是否是定长的(所有值占相同数量的空间)或可变长的(所占空间量依赖于所存储的值)。
- 该类型的值怎样比较和存储。
- 此类型是否允许 NULL 值。
- 此类型是否可以索引。
下面是创建一个表的例子:
CREATE TABLE teacher
(
id TINYINT UNSIGNED NOT NULL,
name CHAR(16) NOT NULL,
tele NUMERIC(8),
sex ENUM("F","M") DEFAULT "M"
)
由上面这个例子可以知道,创建列类型的语法是:
col_name col_type [col_attributes][general_attributes]
- col_name 列的名字
- col_type 列类型,控制存储在列中的数据类型
- col_attributes 专用属性,只能应用于制定列,例如,我们还不知道的BINARY。如果你使用专用属性,必须在列的类型之后,列的通用属性之前。
- general_attributes通用属性,可以应用在出少数列的任意列,例如上面提到了NULL、NOT NULL、和DEFAULT。
我们将简要地考察一下 MySQL列类型以获得一个总的概念,然后更详细地讨论描述每种列类型的属性。
MySQL的数字类型如表1-3所示,可以包括浮点类型和整数类型:
表1-3 MySQL的数字列类型
类型名 | 涵义 |
TINYINT | 一个很小的整数 |
SMALLINT | 一个小整数 |
MEDIUMINT | 一个中等大小整数 |
INT、INTEGER | 一个正常大小整数 |
BIGINT | 一个大整数 |
FLOAT | 一个小(单精密)浮点数字 |
DOUBLE DOUBLE PRECISION REAL | 一个正常大小(双精密)浮点数字 |
DECIMAL NUMERIC | 一个未压缩(unpack)的浮点数字,“未压缩”意味着数字作为一个字符串被存储 |
MySQL的字符串类型如表1-4所示,串类型中不仅可以存储字符串,实际上任何二进制数据,例如,图象、音频、视频等,都可以存储在串类型中。
表1-4 MySQL的字符串列类型
类型名 | 涵义 |
CHAR | 一个定长字符串 |
VARCHAR | 一个变长字符串 |
TINYBLOB TINYTEXT | 最大长度为255(2^8-1)个字符的BLOB或TEXT列 |
BLOB TEXT | 最大长度为65535(2^16-1)个字符的BLOB或TEXT列 |
MEDIUMBLOB MEDIUMTEXT | 最大长度为16777215(2^24-1)个字符的BLOB或TEXT列 |
LONGBLOB LONGTEXT | 最大长度为4294967295(2^32-1)个字符的BLOB或TEXT列 |
ENUM('value1','value2',...) | 枚举:列只能赋值为某个枚举成员或NULL |
SET('value1','value2',...) | 集合:列可以赋值为多个集合成员或NULL |
MySQL的日期与时间类型如表1-5所示。MySQL允许你存储某个“不严格地”合法的日期值,例如1999-11-31,原因我们认为它是应用程序的责任来处理日期检查,而不是SQL服务器。为了使日期检查更“快”,MySQL仅检查月份在0-12的范围,天在0-31的范围。
表1-5 MySQL的时间和日期列类型
类型名 | 涵义 |
DATE | 一个日期,以'YYYY-MM-DD'格式来显示 |
TIME | 一个日期和时间组合,以'YYYY-MM-DD HH:MM:SS'格式来显示 |
DATETIME | 最大长度为255(2^8-1)个字符的BLOB或TEXT列 |
TIMESTAMP | 一个时间戳, 以YYYMMDDHHMMSS格式来显示 |