5.1 MySQL数据类型介绍
MySQL支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。
⑴ 数值数据类型:包括整数类型TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、浮点小数数据类型FLOAT和DOUBLE、定点小数类型DECIMAL、
⑵ 日期/时间类型:包括YEAR、TIME、DATE、DATETIME、和TIMESTAMP
⑶ 字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。
5.1.1 整数类型
数值型数据类型主要用来存储数字,MySQL提供多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也会越大。MySQL主要提供的整数类型有:TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT。整型类型属性字段可以添加AUTO_INCREMENT自增约束条件。【表5.1】列出了MySQL中的数值类型。
类型名称 |
说明 |
存储需求 |
TINYINT |
很小的整数 |
1个字节 |
SMALLINT |
小的整数 |
2个字节 |
MEDIUMINT |
中等大小的整数 |
3个字节 |
INT(INTEGER) |
普通大小的整数 |
4个字节 |
BIGINT |
大整数 |
8个字节 |
从表中可以看到,不同类型整数存储所需的字节数是不同的,占用字节数最小的是TINYINT类型,占用字节最大的是BITINT类型,相应的占用字节越多的类型所能表示的数值范围越大。根据占用字节数可以求出每一种数据类型的取值范围,例如TINYINT需要1个字节(8 bits)来存储,那么TINYINT无符号数的最大值为28-1,即255,TINYINT有符号数的最大值为27-1,即127。其他类型的整数的取值范围计算方法相同,其取值范围如【表5.2】。
表5.2 不同整数类型的取值范围
数据类型 |
有符号 |
无符号 |
TINYINT |
-128到127 |
0到255 |
SMALLINT |
32768到32767 |
0到65535 |
MEDIUMINT |
-8388608到8388607 |
0到16777215 |
INT(INTEGER) |
-2147483648到2147483647 |
0到4294967295 |
BIGINT |
-9223372036854775808到9223372036854775807 |
0到18446744073709551615 |
在第四章开始创建表章节中,有如下创建表的语句:
CREATE TABLE tb_emp1
(
id INT(11),
name VARCHAR(25),
deptId INT(11),
salary FLOAT
);
id字段的数据类型为INT(11),注意到后面的数字11,这表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数。例如,假设声明一个INT类型的字段:
year INT(4)
该声明指明,在year字段中的数据一般只显示4位数字的宽度。
在这里读者要注意:显示宽度和数据类型的取值范围是无关的。显示宽度只是指明MySQL最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。例如,假如向year字段插入一个数值19999,当使用SELECT查询该列的值时候,MySQL显示的将使完整的带有5位数字的19999,而不是4位数字的值。
其他整型数据类型也可以在定义表结构时指定所需要的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度值,如【例5.1】。
【例5.1】创建表tmp1,其中字段x,y,z,m,n数据类型依次为TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,SQL语句如下:
CREATE TABLE tmp1 ( x TINYINT, y SMALLINT, z MEDIUMINT, m INT, n BIGINT );
执行成功之后,是用DESC查看表结构,结果如下:
mysql> DESC tmp1;
+-------+-----------------+------+-----+----------+--------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------+------+-----+----------+--------+
| x | tinyint(4) | YES | | NULL | |
| y | smallint(6) | YES | | NULL | |
| z | mediumint(9) | YES | | NULL | |
| m | int(11) | YES | | NULL | |
| n | bigint(20) | YES | | NULL | |
+-------+-----------------+-------+-----+----------+-------+
5 rows in set (0.00 sec)
可以看到,系统将添加不同的默认显示宽度。这些显示宽度能够保证显示每一种数据类型可以取到取值范围内的所有值。例如TINYINT有符号数和无符号数的取值范围分别为-128~127和0~255,由于负号占了一个数字位,因此TINYINT默认的显示宽度为4。同理,其他整数类型的默认显示宽度与其有符号数的最小值的宽度相同。
不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此,应该根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。整数类型是不带小数部分的数值,现实生活中很多地方需要用到带小数的数值,下面将介绍MySQL中支持的小数类型。
