一、数值类型
1. 数值类型
标准sql中包含数据类型 INTEGER, SMALLINT, DECIMAL, NUMERIC,以及FLOAT, REAL, DOUBLE。mysql在此基础上进行了拓展,增加了TINYINT, MEDIUMINT, BIGINT三种长度不同的整数,以及BIT类型,用来存放位数据。
整数类型 | 字节 |
---|---|
TINYINT | 1 |
SMALLINT | 2 |
MEDIUMINT | 3 |
INT/INTEGER | 4 |
BIGINT | 8 |
浮点数类型 | 字节 |
---|---|
FLOAT | 4 |
DOUBLE | 8 |
定点整数类型 | 字节 |
---|---|
DEC(M,D)/DECIMAL(M,D) | M+2 |
(1.1) 整数类型
整数类型,mysql支持在类型名称后面的小括号内指定显示宽度,如int(5)表示当数值宽度小于5位的时候在数字前面填满宽度,如果不显式指定宽度则默认为int(11),这一般配合zero_fill一块使用,如
create table t1(id int(5) zerofill);#表t1中的id列宽度为5位整数,如果数据位数小于5,则在前面添加0;如果数据位数大于5,仍然显示正确的数据,即不会受到数据位数的限制,只要保证该数据是个合法的4字节可以表示的整数。
整数类型有unsigned属性,如果一个列指定为zerofill,则mysql会自动给该列添加unsigned属性。
整数类型有uto_increment属性一般从1开始,每行增加1,在插入null到一个auto_increment列时,mysql插入一个比该列中当前最大值大1的值。一个表中最多只能有一个auto_increment列。对于任何想要使用auto_increment的列,应该定义为not null,并定义为primary key或定义为unique键。比如:
create table ai (id int auto_increment not null primary key);
create table ai(id int auto_increment not null, primary key(id));
create table ai(id int auto_increment not null, unique(id));
(1.2) 浮点数类型和定点数类型
定点数在mysql内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。浮点数和定点数都可以用类型名称后加"(M,D)"的形式来表示,M为整数加小数部分的总位数,D为小数部分的位置。float, double在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统来决定)来显示,decimal在不指定精度时,默认的整数为为10,默认的小数为为0.
比如用默认的decimal来存放数据1.23, 则实际只会保留整数位1,小数位的.23被丢弃。
(1.3) BIT类型
bit位类型用于存放位字段值,BIT(M)可以用来存放多位二进制数,M范围从1到64,如果不写则默认为1位。对于位字段,直接使用SELECT命令将不会看到结果,可以用bin()(显示为二进制格式)或者hex()(显示为十六进制格式)函数进行读取。
2. 日期和时间类型
日期和时间类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
DATE | 4 | 1000-01-01 | 9999-12-31 |
DATETIME | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 4 | 19700101080001 | 2038年的某个时刻 |
TIME | 3 | -838:59:59 | 838:59:59 |
YEAR | 1 | 1901 | 2155 |
TIMESTAMP值返回后显示为 YYYY-MM-DD HH:MM:SS格式的字符串,显示宽度固定为19个字符;如果想要获得数字值,在TIMESTAMP列添加"+0"即可。如果需要经常插入或者更新日期为当前系统时间,则通常使用TIMESTAMP来表示;TIMESTAMP还和时区相关,插入日期时,会先转化为本地时区后存放,而从数据库取出时,也同样需要经日期转换为本地时区后显示。
3. 字符串类型
mysql包含CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM, SET等多种字符串类型。
(3.1) CAHR和VARCHAR类型
CHAR 长度为创建表时声明的长度,0-255;VARCHAR为可变长字符串。在检索时,CHAR列删除了尾部的空格,而VARCHAR保留这些空格。比如:
create table vc(v varchar(4), c char(4));
insert into vc values(‘ab‘, ‘ab‘);
select length(v), length(c) from vc;#结果为4, 2
select concat(v, ‘+‘), concat(c, ‘+‘) from vc; #显示为 ab +和 ab+.
即,char列最后的空格在做操作时都已经被删除,而varchar依然保留空格。
(3.2) BINARY和VARBINARY类型
BINARY和VARBINARY包含二进制字符串而不包含非二进制字符串。当保存BINARY值时,在值的最后通过填充"0x00"以达到指定的字段定义长度。对于一个BINARY(3)列,插入‘a‘时,变为‘a\0\0‘.
(3.3) ENUM类型
1~255个成员的枚举需要1个字节,255~65535个成员的枚举需要2个字节,最多允许65535个成员。枚举类型的成员为 字符串类型:1个或多个字符。比如:
create table t(en enum(‘hello‘,‘world‘));
(3.4) SET类型
SET类型也是一个字符串对象,里面可以包含0~64个成员,每个成员对应一个比特位,即最多有8个比特位。
SET类型一次可以选取多个成员,而ENUM只能选一个。比如,在表t中插入多组不同的成员:
create table t(col set(‘a‘,‘b‘,‘c‘,‘d‘));
insert into t values(‘a,b‘), (‘c,d‘), (‘a, c, d‘); #一次插入多个记录