| 日期和时间类型 | 字节 | 最小值 | 最大值 |
|---|---|---|---|
| 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 |
每种时间类型都有一个有效范围,如果超出这个范围,在默认的SQLMode下,系统会进行错误提示,并将以零值来进行存储。
数据类型
零值表示DATE0000-00-00DATETIME0000-00-00 00:00:00TIMESTAMP00000000000000TIME00:00:00YEAR0000
--创建表tdt mysql> create table tdt(dt date, dttm datetime, tms timestamp,tm time,yr year);
--使用now()函数向表中插入当前时间 mysql> insert into tdt values(now(),now(),now(),now(),now() );
--向tms中插入NULL,MySQL会自动赋值系统时间 mysql> insert into tdt(tms) values(null);
MySQL只会给表中第一个TIMESTAMP字段赋值系统时间,如果有其他的,则赋值为0值。
--修改表tdt,增加TIMESTAMP类型的tms1列,并给tms,tms1赋值null mysql> alter table tdt add tms1 timestamp; mysql> desc tdt; mysql> insert into tdt(tms,tms1) values(null,null);
TIMESTAMP有一个重要特点,就是和失去相关。当插入提起时,会先转换为本地时区后存放;而从数据库取出时,需要将日期转换为本地时区后显示。
--创建表tdt1,包含字段tms,dt mysql> create table tdt1(tms timestamp,dt datetime);
--查看当前时区,并向表tdt1中插入系统时间 mysql> show variables like 'time_zone'; mysql> insert into tdt1 values(now(),now());
可以发现,时区的值为SYSTEM,这个值默认是和主机的时区一致的,因为处在中国,这里实际是东八区(+8:00)。
--修改时区为东九区,再次查看tdt1中的时间 mysql> set time_zone='+9:00';
字符串类型
MySQL中提供了多种对字符串数据的存储类型,不同版本有所差异。以5.0为例,MySQL包括了CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等多种。
| 数据类型 | 描述即存储 |
|---|---|
| CHAR(M) | M为0~255之间的整数 |
| VARCHAR(M) | M为0~65535之间的整数,值的长度+1个字节 |
| TINYBLOB | 允许长度0~255字节,值的长度+1个字节 |
| BLOB | 允许长度0~65535字节,值的长度+2个字节 |
| MEDIUMBLOB | 允许长度0~167772150字节,值的长度+3个字节 |
| LONGBLOB | 允许长度0~4294967295字节,值的长度+4个字节 |
| TINYTEXT | 允许长度0~255字节,值的长度+1个字节 |
| TEXT | 允许长度0~65535字节,值的长度+2个字节 |
| MEDIUMTEXT | 允许长度0~167772150字节,值的长度+3个字节 |
| LONGTEXT | 允许长度0~4294967295字节,值的长度+4个字节 |
| VARBINARY(M) | 允许长度0~M个字节的变长字节字符串,值的长度+1个字节 |
| BINARY(M) | 允许长度0~M个字节的定长字节字符串 |
方法
CHAR和VARCHAR
两者很类似,都用来保存MySQL中较短的字符串。二者主要区别在于存储方式的不同:CHAR列的长度固定为创建表时声明的长度;而VARCHAR列中的值为可变长字符串。在检索时,CHAR会删除尾部的空格,而VARCHAR不会。
--创建表tc,包含两个字段ch(char(6))和vc(varchar(6))
mysql> create table tc (ch char(6),vc varchar(6));
--向ch和vc字段插入'abc '
mysql> insert into tc values('abc ','abc ');
--查询字段长度
mysql> select length(ch),length(vc) from tc;
BINARY和VARBINARY
类似于CHAR和VARCHAR,不同的是它们存储的是二进制的字符串。
--创建表tbc,包含字段bc(binary(6))、vbc(varbinary(6))
mysql> create table tbc (bc binary(6),vbc varbinary(6));
--向表中插入数据('a ','a ')
mysql> insert into tbc values('a ','a ');
--查看字段值长度
mysql> select length(bc),length(vbc) from tbc;
当保存BINARY值时,MySQL通过在值的最后填充0x00(零字节)以达到指定的字段定义长度。
--通过hex()函数查看tbc中数据的保存 mysql> select length(bc),length(vbc) from tbc;
ENUM类型
枚举类型,它的值范围需要在创建表时通过枚举方式显示指定,对1255个成员的枚举,需要1个字节存储;对于25665535个成员,需要2个字节存储。最多允许有65535个成员。
--创建表te,包含字段f1(enum('a','b','c'))
mysql> create table te(f1 enum('a','b','c'));
--向表中插入几条记录
mysql> insert into te values('a'),('B'),('3'),(null);
ENUM是忽略大小写的。还支持使用下标(从1开始,下标越界时报错)的方式插入数据。特殊值'0'表示一个空值。
SET类型
SET和ENUM非常类似,也是一个字符串对象,里面可以包含0~64个成员。根据成员个数不同,存储也有所不同。
1~8个成员的集合,占1个字节
9~16个成员的集合,占2个字节
17~24个成员的集合,占3个字节
25~32个成员的集合,占4个字节
32~64个成员的集合,占8个字节
而且,SET类型一次可以选择多个成员。
--创建表ts,包含字段f1(set())
mysql> create table ts (f1 set('a','b','c','d'));
mysql> insert into ts values('a,b'),('a,d'),('b,c,d');
--向表中插入数据('a,b,a,c,d,d')
mysql> insert into ts values('a,b,a,c,d,d');
SET类型可以从允许值集合中选择任意个元素进行组合,所以对于输入的值只要在允许值的组合范围内,都可以正确的记录到SET类型的列中。对于超出允许范围的值,报错。而有重复成员的集合,将自动去重。
到此这篇关于MySQL 5.7常见数据类型的文章就介绍到这了,更多相关MySQL数据类型内容请搜索
更多相关Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。