一 存储引擎介绍
一、什么是存储引擎
二、MySQL支持的存储引擎
三、使用存储引擎
二 表介绍、创建及查询
三 数据类型
一、类型介绍
二、数值类型
三、日期类型
四、字符串类型
五、枚举类型与集合类型
四 表完整性约束
五 修改表ALTER TABLE
六 复制表
七 删除表
一 存储引擎介绍
一、什么是存储引擎
mysql中建立的库===>文件夹
库中建立的表===>文件
现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。
存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)
在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎
SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据的查询。
二、MySQL支持的存储引擎
1 MariaDB [(none)]> show engines\G #查看所有支持的存储引擎 2 MariaDB [(none)]> show variables like ‘storage_engine%‘; #查看正在使用的存储引擎
MySQL存储引擎介绍
1 #InnoDB 存储引擎 2 支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其 3 特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。 4 InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于建立其表空间。 5 InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。 6 对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。 7 InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。 8 9 #MyISAM 存储引擎 10 不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。 11 12 #NDB 存储引擎 13 年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。 14 15 #Memory 存储引擎 16 正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。 17 18 #Infobright 存储引擎 19 第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。 20 21 #NTSE 存储引擎 22 网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。 23 24 #BLACKHOLE 25 黑洞存储引擎,可以应用于主备复制中的分发主库。 26 27 MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在。
三、使用存储引擎
方法1:建表时指定
1 MariaDB [db1]> create table innodb_t1(id int,name char)engine=innodb; 2 MariaDB [db1]> create table innodb_t2(id int)engine=innodb; 3 MariaDB [db1]> show create table innodb_t1; 4 MariaDB [db1]> show create table innodb_t2;
方法2:在配置文件中指定默认的存储引擎
1 /etc/my.cnf 2 [mysqld] 3 default-storage-engine=INNODB 4 innodb_file_per_table=1
查看
1 [root@lucy db1]# cd /var/lib/mysql/db1/ 2 [root@lucy db1]# ls 3 db.opt innodb_t1.frm innodb_t1.ibd innodb_t2.frm innodb_t2.ibd
练习
创建四个表,分别使用innodb,myisam,memory,blackhole存储引擎,进行插入数据测试
1 MariaDB [db1]> create table t1(id int)engine=innodb; 2 MariaDB [db1]> create table t2(id int)engine=myisam; 3 MariaDB [db1]> create table t3(id int)engine=memory; 4 MariaDB [db1]> create table t4(id int)engine=blackhole; 5 MariaDB [db1]> quit 6 [root@egon db1]# ls /var/lib/mysql/db1/ #发现后两种存储引擎只有表结构,无数据 7 db.opt t1.frm t1.ibd t2.MYD t2.MYI t2.frm t3.frm t4.frm 8 9 #memory,在重启mysql或者重启机器后,表内数据清空 10 #blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录
二 表介绍、创建及查询
表介绍
表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段
创建表
#语法: create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); #注意: 1. 在同一张表中,字段名是不能相同 2. 宽度和约束条件可选 3. 字段名和类型是必须的
MariaDB [(none)]> create database db1 charset utf8; MariaDB [(none)]> use db1; MariaDB [db1]> create table t1( -> id int, -> name varchar(50), -> sex enum(‘male‘,‘female‘), -> age int(3) -> ); MariaDB [db1]> show tables; #查看db1库下所有表名 MariaDB [db1]> desc t1; +-------+-----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(50) | YES | | NULL | | | sex | enum(‘male‘,‘female‘) | YES | | NULL | | | age | int(3) | YES | | NULL | | +-------+-----------------------+------+-----+---------+-------+ MariaDB [db1]> select id,name,sex,age from t1; Empty set (0.00 sec) MariaDB [db1]> select * from t1; Empty set (0.00 sec) MariaDB [db1]> select id,name from t1; Empty set (0.00 sec)
1 MariaDB [db1]> insert into t1 values 2 -> (1,‘lucy‘,18,‘female‘), 3 -> (2,‘anna‘,19,‘female‘) 4 -> ; 5 MariaDB [db1]> select * from t1; 6 +------+------+------+--------+ 7 | id | name | age | sex | 8 +------+------+------+--------+ 9 | 1 | lucy | 18 | female | 10 | 2 | anna | 19 | female | 11 +------+------+------+--------+ 12 13 14 15 MariaDB [db1]> insert into t1(id) values 16 -> (3), 17 -> (4); 18 MariaDB [db1]> select * from t1; 19 +------+------+------+--------+ 20 | id | name | age | sex | 21 +------+------+------+--------+ 22 | 1 | lucy | 18 | female | 23 | 2 | anna | 19 | female | 24 | 3 | NULL | NULL | NULL | 25 | 4 | NULL | NULL | NULL | 26 +------+------+------+--------+
注意:表中的最后一个字段不要加逗号
查询
1 MariaDB [db1]> describe t1; #查看表结构,可简写为desc 表名 2 +-------+-----------------------+------+-----+---------+-------+ 3 | Field | Type | Null | Key | Default | Extra | 4 +-------+-----------------------+------+-----+---------+-------+ 5 | id | int(11) | YES | | NULL | | 6 | name | varchar(50) | YES | | NULL | | 7 | sex | enum(‘male‘,‘female‘) | YES | | NULL | | 8 | age | int(3) | YES | | NULL | | 9 +-------+-----------------------+------+-----+---------+-------+ 10 11 12 MariaDB [db1]> show create table t1\G; #查看表详细结构,可加\G
三 数据类型
一、类型介绍
存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的。
mysql常用数据类型概览
1 #1. 数字: 2 整型:tinyinit int bigint 3 小数: 4 float :在位数比较短的情况下不精准 5 double :在位数比较长的情况下不精准 6 0.000001230123123123 7 存成:0.000001230000 8 9 decimal:(如果用小数,则用推荐使用decimal) 10 精准 11 内部原理是以字符串形式去存 12 13 #2. 字符串: 14 char(10):简单粗暴,浪费空间,存取速度快 15 root存成root000000 16 varchar:精准,节省空间,存取速度慢 17 18 sql优化:创建表时,定长的类型往前放,变长的往后放 19 比如性别 比如地址或描述信息 20 21 >255个字符,超了就把文件路径存放到数据库中。 22 比如图片,视频等找一个文件服务器,数据库中只存路径或url。 23 24 25 26 #3. 时间类型: 27 最常用:datetime 28 29 30 #4. 枚举类型与集合类型
二、数值类型
1、整数类型
整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:存储年龄,等级,id,各种号码等
1 ======================================== 2 tinyint[(m)] [unsigned] [zerofill] 3 4 小整数,数据类型用于保存一些范围的整数数值范围: 5 有符号: 6 -128 ~ 127 7 无符号: 8 ~ 255 9 10 PS: MySQL中无布尔值,使用tinyint(1)构造。 11 12 13 14 ======================================== 15 int[(m)][unsigned][zerofill] 16 17 整数,数据类型用于保存一些范围的整数数值范围: 18 有符号: 19 -2147483648 ~ 2147483647 20 无符号: 21 ~ 4294967295 22 23 24 25 ======================================== 26 bigint[(m)][unsigned][zerofill] 27 大整数,数据类型用于保存一些范围的整数数值范围: 28 有符号: 29 -9223372036854775808 ~ 9223372036854775807 30 无符号: 31 ~ 18446744073709551615
1 =========有符号和无符号tinyint========== 2 #tinyint默认为有符号 3 MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号 4 MariaDB [db1]> desc t1; 5 MariaDB [db1]> insert into t1 values 6 -> (-129), 7 -> (-128), 8 -> (127), 9 -> (128); 10 MariaDB [db1]> select * from t1; 11 +------+ 12 | x | 13 +------+ 14 | -128 | #-129存成了-128 15 | -128 | #有符号,最小值为-128 16 | 127 | #有符号,最大值127 17 | 127 | #128存成了127 18 +------+ 19 20 21 22 #设置无符号tinyint 23 MariaDB [db1]> create table t2(x tinyint unsigned); 24 MariaDB [db1]> insert into t2 values 25 -> (-1), 26 -> (0), 27 -> (255), 28 -> (256); 29 MariaDB [db1]> select * from t2; 30 +------+ 31 | x | 32 +------+ 33 | 0 | -1存成了0 34 | 0 | #无符号,最小值为0 35 | 255 | #无符号,最大值为255 36 | 255 | #256存成了255 37 +------+ 38 39 40 41 ============有符号和无符号int============= 42 #int默认为有符号 43 MariaDB [db1]> create table t3(x int); #默认为有符号整数 44 MariaDB [db1]> insert into t3 values 45 -> (-2147483649), 46 -> (-2147483648), 47 -> (2147483647), 48 -> (2147483648); 49 MariaDB [db1]> select * from t3; 50 +-------------+ 51 | x | 52 +-------------+ 53 | -2147483648 | #-2147483649存成了-2147483648 54 | -2147483648 | #有符号,最小值为-2147483648 55 | 2147483647 | #有符号,最大值为2147483647 56 | 2147483647 | #2147483648存成了2147483647 57 +-------------+ 58 59 60 61 #设置无符号int 62 MariaDB [db1]> create table t4(x int unsigned); 63 MariaDB [db1]> insert into t4 values 64 -> (-1), 65 -> (0), 66 -> (4294967295), 67 -> (4294967296); 68 MariaDB [db1]> select * from t4; 69 +------------+ 70 | x | 71 +------------+ 72 | 0 | #-1存成了0 73 | 0 | #无符号,最小值为0 74 | 4294967295 | #无符号,最大值为4294967295 75 | 4294967295 | #4294967296存成了4294967295 76 +------------+ 77 78 79 80 81 ==============有符号和无符号bigint============= 82 MariaDB [db1]> create table t6(x bigint); 83 MariaDB [db1]> insert into t5 values 84 -> (-9223372036854775809), 85 -> (-9223372036854775808), 86 -> (9223372036854775807), 87 -> (9223372036854775808); 88 89 MariaDB [db1]> select * from t5; 90 +----------------------+ 91 | x | 92 +----------------------+ 93 | -9223372036854775808 | 94 | -9223372036854775808 | 95 | 9223372036854775807 | 96 | 9223372036854775807 | 97 +----------------------+ 98 99 100 101 MariaDB [db1]> create table t6(x bigint unsigned); 102 MariaDB [db1]> insert into t6 values 103 -> (-1), 104 -> (0), 105 -> (18446744073709551615), 106 -> (18446744073709551616); 107 108 MariaDB [db1]> select * from t6; 109 +----------------------+ 110 | x | 111 +----------------------+ 112 | 0 | 113 | 0 | 114 | 18446744073709551615 | 115 | 18446744073709551615 | 116 +----------------------+ 117 118 119 120 121 ======用zerofill测试整数类型的显示宽度============= 122 MariaDB [db1]> create table t7(x int(3) zerofill); 123 MariaDB [db1]> insert into t7 values 124 -> (1), 125 -> (11), 126 -> (111), 127 -> (1111); 128 MariaDB [db1]> select * from t7; 129 +------+ 130 | x | 131 +------+ 132 | 001 | 133 | 011 | 134 | 111 | 135 | 1111 | #超过宽度限制仍然可以存 136 +------+
注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下
其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了
默认的显示宽度,都是在最大值的基础上加1
int的存储宽度是4个Bytes,即32个bit,即2**32
无符号最大值为:4294967296-1
有符号最大值:2147483648-1
有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的
最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok
2、浮点型
定点数类型 DEC等同于DECIMAL
浮点类型:FLOAT DOUBLE
作用:存储薪资、身高、体重、体质参数等
1 ====================================== 2 #FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 3 4 定义: 5 单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30 6 7 有符号: 8 -3.402823466E+38 to -1.175494351E-38, 9 1.175494351E-38 to 3.402823466E+38 10 无符号: 11 1.175494351E-38 to 3.402823466E+38 12 13 14 精确度: 15 **** 随着小数的增多,精度变得不准确 **** 16 17 18 ====================================== 19 #DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 20 21 定义: 22 双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30 23 24 有符号: 25 -1.7976931348623157E+308 to -2.2250738585072014E-308 26 2.2250738585072014E-308 to 1.7976931348623157E+308 27 28 无符号: 29 2.2250738585072014E-308 to 1.7976931348623157E+308 30 31 精确度: 32 ****随着小数的增多,精度比float要高,但也会变得不准确 **** 33 34 ====================================== 35 decimal[(m[,d])] [unsigned] [zerofill] 36 37 定义: 38 准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。 39 40 41 精确度: 42 **** 随着小数的增多,精度始终准确 **** 43 对于精确数值计算时需要用此类型 44 decaimal能够存储精确值的原因在于其内部按照字符串存储。
1 mysql> create table t1(x float(256,31)); 2 ERROR 1425 (42000): Too big scale 31 specified for column ‘x‘. Maximum is 30. 3 mysql> create table t1(x float(256,30)); 4 ERROR 1439 (42000): Display width out of range for column ‘x‘ (max = 255) 5 mysql> create table t1(x float(255,30)); #建表成功 6 Query OK, 0 rows affected (0.02 sec) 7 8 mysql> create table t2(x double(255,30)); #建表成功 9 Query OK, 0 rows affected (0.02 sec) 10 11 mysql> create table t3(x decimal(66,31)); 12 ERROR 1425 (42000): Too big scale 31 specified for column ‘x‘. Maximum is 30. 13 mysql> create table t3(x decimal(66,30)); 14 ERROR 1426 (42000): Too-big precision 66 specified for ‘x‘. Maximum is 65. 15 mysql> create table t3(x decimal(65,30)); #建表成功 16 Query OK, 0 rows affected (0.02 sec) 17 18 mysql> show tables; 19 +---------------+ 20 | Tables_in_db1 | 21 +---------------+ 22 | t1 | 23 | t2 | 24 | t3 | 25 +---------------+ 26 rows in set (0.00 sec) 27 28 29 30 mysql> insert into t1 values(1.1111111111111111111111111111111); #小数点后31个1 31 Query OK, 1 row affected (0.01 sec) 32 33 mysql> insert into t2 values(1.1111111111111111111111111111111); 34 Query OK, 1 row affected (0.00 sec) 35 36 mysql> insert into t3 values(1.1111111111111111111111111111111); 37 Query OK, 1 row affected, 1 warning (0.01 sec) 38 39 mysql> select * from t1; #随着小数的增多,精度开始不准确 40 +----------------------------------+ 41 | x | 42 +----------------------------------+ 43 | 1.111111164093017600000000000000 | 44 +----------------------------------+ 45 row in set (0.00 sec) 46 47 mysql> select * from t2; #精度比float要准确点,但随着小数的增多,同样变得不准确 48 +----------------------------------+ 49 | x | 50 +----------------------------------+ 51 | 1.111111111111111200000000000000 | 52 +----------------------------------+ 53 row in set (0.00 sec) 54 55 mysql> select * from t3; #精度始终准确,d为30,于是只留了30位小数 56 +----------------------------------+ 57 | x | 58 +----------------------------------+ 59 | 1.111111111111111111111111111111 | 60 +----------------------------------+ 61 row in set (0.00 sec)
3、位类型(了解)
BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
注意:对于位字段需要使用函数读取
bin()显示为二进制
hex()显示为十六进制
1 MariaDB [db1]> create table t9(id bit); 2 MariaDB [db1]> desc t9; #bit默认宽度为1 3 +-------+--------+------+-----+---------+-------+ 4 | Field | Type | Null | Key | Default | Extra | 5 +-------+--------+------+-----+---------+-------+ 6 | id | bit(1) | YES | | NULL | | 7 +-------+--------+------+-----+---------+-------+ 8 9 MariaDB [db1]> insert into t9 values(8); 10 MariaDB [db1]> select * from t9; #直接查看是无法显示二进制位的 11 +------+ 12 | id | 13 +------+ 14 | | 15 +------+ 16 MariaDB [db1]> select bin(id),hex(id) from t9; #需要转换才能看到 17 +---------+---------+ 18 | bin(id) | hex(id) | 19 +---------+---------+ 20 | 1 | 1 | 21 +---------+---------+ 22 23 MariaDB [db1]> alter table t9 modify id bit(5); 24 MariaDB [db1]> insert into t9 values(8); 25 MariaDB [db1]> select bin(id),hex(id) from t9; 26 +---------+---------+ 27 | bin(id) | hex(id) | 28 +---------+---------+ 29 | 1 | 1 | 30 | 1000 | 8 | 31 +---------+---------+
三、日期类型
DATE TIME DATETIME TIMESTAMP YEAR
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
1 YEAR 2 YYYY(1901/2155) 3 4 DATE 5 YYYY-MM-DD(1000-01-01/9999-12-31) 6 7 TIME 8 HH:MM:SS(‘-838:59:59‘/‘838:59:59‘) 9 10 DATETIME 11 12 YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y) 13 14 TIMESTAMP 15 16 YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
1 ============year=========== 2 MariaDB [db1]> create table t10(born_year year); #无论year指定何种宽度,最后都默认是year(4) 3 MariaDB [db1]> insert into t10 values 4 -> (1900), 5 -> (1901), 6 -> (2155), 7 -> (2156); 8 MariaDB [db1]> select * from t10; 9 +-----------+ 10 | born_year | 11 +-----------+ 12 | 0000 | 13 | 1901 | 14 | 2155 | 15 | 0000 | 16 +-----------+ 17 18 19 ============date,time,datetime=========== 20 MariaDB [db1]> create table t11(d date,t time,dt datetime); 21 MariaDB [db1]> desc t11; 22 +-------+----------+------+-----+---------+-------+ 23 | Field | Type | Null | Key | Default | Extra | 24 +-------+----------+------+-----+---------+-------+ 25 | d | date | YES | | NULL | | 26 | t | time | YES | | NULL | | 27 | dt | datetime | YES | | NULL | | 28 +-------+----------+------+-----+---------+-------+ 29 30 MariaDB [db1]> insert into t11 values(now(),now(),now()); 31 MariaDB [db1]> select * from t11; 32 +------------+----------+---------------------+ 33 | d | t | dt | 34 +------------+----------+---------------------+ 35 | 2017-07-25 | 16:26:54 | 2017-07-25 16:26:54 | 36 +------------+----------+---------------------+ 37 38 39 40 ============timestamp=========== 41 MariaDB [db1]> create table t12(time timestamp); 42 MariaDB [db1]> insert into t12 values(); 43 MariaDB [db1]> insert into t12 values(null); 44 MariaDB [db1]> select * from t12; 45 +---------------------+ 46 | time | 47 +---------------------+ 48 | 2017-07-25 16:29:17 | 49 | 2017-07-25 16:30:01 | 50 +---------------------+ 51 52 53 54 ============注意啦,注意啦,注意啦=========== 55 1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入 56 2. 插入年份时,尽量使用4位值 57 3. 插入两位年份时,<=69,以20开头,比如50, 结果2050 58 >=70,以19开头,比如71,结果1971 59 MariaDB [db1]> create table t12(y year); 60 MariaDB [db1]> insert into t12 values 61 -> (50), 62 -> (71); 63 MariaDB [db1]> select * from t12; 64 +------+ 65 | y | 66 +------+ 67 | 2050 | 68 | 1971 | 69 +------+ 70 71 72 73 ============综合练习=========== 74 MariaDB [db1]> create table student( 75 -> id int, 76 -> name varchar(20), 77 -> born_year year, 78 -> birth date, 79 -> class_time time, 80 -> reg_time datetime); 81 82 MariaDB [db1]> insert into student values 83 -> (1,‘lucy‘,"1995","1995-11-11","11:11:11","2017-11-11 11:11:11"), 84 -> (2,‘anna‘,"1997","1997-12-12","12:12:12","2017-12-12 12:12:12"), 85 -> (3,‘luna‘,"1998","1998-01-01","13:13:13","2017-01-01 13:13:13"); 86 87 MariaDB [db1]> select * from student; 88 +------+------+-----------+------------+------------+---------------------+ 89 | id | name | born_year | birth | class_time | reg_time | 90 +------+------+-----------+------------+------------+---------------------+ 91 | 1 | lucy | 1995 | 1995-11-11 | 11:11:11 | 2017-11-11 11:11:11 | 92 | 2 | anna | 1997 | 1997-12-12 | 12:12:12 | 2017-12-12 12:12:12 | 93 | 3 | luna | 1998 | 1998-01-01 | 13:13:13 | 2017-01-01 13:13:13 | 94 +------+------+-----------+------------+------------+---------------------+
1 在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。 2 3 1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。 4 5 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。 6 7 3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。 8 9 4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。