MySQL数据库的数据类型和基于MySQL数据类型的综合实例项目(中)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: MySQL数据库的数据类型和基于MySQL数据类型的综合实例项目(中)

4、DATETIME


DATETIME类型用于需要同时包含日期和时间信息的值,在存储时需要8字节。日期格式为’YYYY-MM-DD HH:MM:SS’。其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分钟,SS表示秒。在给DATETIME类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATETIME的日期格式即可。


(1)、以’YYYY-MM-DD HH:MM:SS’ 或者’YYYYMMDDHHMMSS’字符串格式表示的值,取值范围为‘1000-01-0100:00:00’~‘ 9999-12-323:59:59’。例如,输入‘2019-12-31 05: 05: 05’或者20191231050505’ ,插入数据库的DATETIME值都为2019-12-31 05: 05: 05。

(2)、以’YY-MM-DD HH:MM:SS’ 或者‘YYMMDDHHMMSS’ 字符串格式表示的日期,在这里YY表示两位的年值。与前面相同,‘00~69’ 范围的年值转换为“2000~2069’ ,‘ 7099’范围的年值转换为‘19701999’。例如,输入‘19-12-31 05:05:05’,插入数据库的DATETIME为2019-12-31 05:05:05;输入‘990505050505’ ,插入数据库的DATETIME为1999-05-05:05:05:

(3)以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期和时间。例如,输入20191231050505,插入数据库的DATETIME为2019-12-31 05:05:05;输入991231050505,插入数据的DATETIME为1999-12-31 05: 05:05。


创建数据表tmp6,定义数据类型为DATETIME的字段dt,向表中插入“YYYY-MM-DD HH:MM:SS”和“YYYYMMDDHHMMSS”字符串格式日期和时间值,SQL语句如下:

首先创建表tmp6:

mysql> CREATE TABLE tmp6(  dt DATETIME );
Query OK, 0 rows affected (0.01 sec)


向表中插入“YYYY-MM-DD HH:MM:SS”和“YYYYMMDDHHMMSS”格式日期:

mysql> INSERT INTO tmp6 values('1998-08-08 08:08:08'),('19980808080808'),('20101010101010');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

查看插入结果:

mysql> SELECT * FROM tmp6;
+---------------------+
| dt                  |
+---------------------+
| 1998-08-08 08:08:08 |
| 1998-08-08 08:08:08 |
| 2010-10-10 10:10:10 |
+---------------------+
3 rows in set (0.00 sec)


向tmp6表中插入“YY-MM-DD HH:MM:SS”和“YYMMDDHHMMSS”字符串格式日期和时间值,SQL语句如下:

向表中插入“YY-MM-DD HH:MM:SS”和“YYMMDDHHMMSS”格式日期:

mysql> INSERT INTO tmp6 values('98-12-09 09:09:09'),('981209090909'),('121010101010');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

查看插入结果:

mysql> SELECT * FROM tmp6;
+---------------------+
| dt                  |
+---------------------+
| 1998-08-08 08:08:08 |
| 1998-08-08 08:08:08 |
| 2010-10-10 10:10:10 |
| 1998-12-09 09:09:09 |
| 1998-12-09 09:09:09 |
| 2012-10-10 10:10:10 |
+---------------------+
6 rows in set (0.00 sec)

向tmp6表中插入YYYYMMDDHHMMSS 和YYMMDDHHMMSS数字格式日期和时间值,SQL语句如下:

向表中插入YYYYMMDDHHMMSS和YYMMDDHHMMSS数字格式日期和时间:


mysql> INSERT INTO tmp6 values(19951008060606), (101016105030);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

查看插入结果:


SELECT * FROM tmp6;
mysql> SELECT * FROM tmp6;
+---------------------+
| dt                  |
+---------------------+
| 1998-08-08 08:08:08 |
| 1998-08-08 08:08:08 |
| 2010-10-10 10:10:10 |
| 1998-12-09 09:09:09 |
| 1998-12-09 09:09:09 |
| 2012-10-10 10:10:10 |
| 1995-10-08 06:06:06 |
| 2010-10-16 10:50:30 |
+---------------------+
8 rows in set (0.00 sec)

向tmp6表中插入系统当前日期和时间值,SQL语句如下:

向表中插入系统当前日期:

mysql> INSERT INTO tmp6 values( NOW() );
Query OK, 1 row affected (0.01 sec)


查看插入结果:

SELECT * FROM tmp6;
mysql> SELECT * FROM tmp6;
+---------------------+
| dt                  |
+---------------------+
| 1998-08-08 08:08:08 |
| 1998-08-08 08:08:08 |
| 2010-10-10 10:10:10 |
| 1998-12-09 09:09:09 |
| 1998-12-09 09:09:09 |
| 2012-10-10 10:10:10 |
| 1995-10-08 06:06:06 |
| 2010-10-16 10:50:30 |
| 2022-08-05 15:15:39 |
+---------------------+
9 rows in set (0.00 sec)

5、TIMESTAMP


TIMESTAMP的显示格式与DATETIME相同,显示宽度固定在19个字符,日期格式为YYYY-MM-DD HH:MM:SS, 在存储时需要4字节。TIMESTAMP 列的取值范围小于DATETIME的取值范围:‘1970-01-01 00:00:01’ UTC~‘2038-01-19 03:14:07’UTC.其中,UTC (Coordinated

Universal Time)为世界标准时间,因此在插入数据时,要保证在合法的取值范围内。

创建数据表tmp7,定义数据类型为TIMESTAMP的字段ts,向表中插入值’19950101010101’,’950505050505’,’1996-02-02 02:02:02’,’97@03@03 03@03@03’,121212121212,NOW(),SQL语句如下:

mysql> CREATE TABLE tmp7( ts TIMESTAMP);
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO tmp7 values ('19950101010101'),
    -> ('950505050505'),
    -> ('1996-02-02 02:02:02'),
    -> ('97@03@03 03@03@03'),
    -> (121212121212),
    -> ( NOW() );
Query OK, 6 rows affected, 1 warning (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 1

查看插入结果:

mysql> SELECT * FROM tmp7;
+---------------------+
| ts                  |
+---------------------+
| 1995-01-01 01:01:01 |
| 1995-05-05 05:05:05 |
| 1996-02-02 02:02:02 |
| 1997-03-03 03:03:03 |
| 2012-12-12 12:12:12 |
| 2022-08-05 15:18:34 |
+---------------------+
6 rows in set (0.00 sec)

1.4、MySQL字符串与文本类型


字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其它数据,比如图片和声音的二进制数据。

CHAR、VARCHAR、BINARY、VARBINARY

BLOB、TEXT、ENUM和SET。

MySQL支持两类字符型数据:文本字符串和二进制字符串。


文本字符串类型是指CHAR、VARCHAR、TEXT、ENUM和SET。


类型名称 说明 存储需求
CHAR(M) 固定长度非二进制字符串 M字节,1≤M≤255
VARCHAR(M) 变长非二进制字符串 L+1字节,在此L≤M和1≤M≤255
TINYTEXT 非常小的非二进制字符串 L+1字节,在此L<2^8
TEXT 小的非一进制字符串 L+2字节,在此L<2^16
MEDIUMTEXT 中等大小的非二进制字 符串 L+3字节,在此L<2^24
LONGTEXT 大的非二进制字符串 L+4字节,在此L<2^32
ENUM 枚举类型,只能有一个枚举字符串值 1或2字节,取决于枚举值的数目最大值为65535
SET 一个设置,字符串对象可以有零个或 多个SET成员 1、 2、3、4或8字节,取决于集合成员的数量,最多为64个成员


1、CHAR


CHAR(M)为固定长度字符串,在定义时指定字符串列长。当保存时在右侧填充空格,以达到指定的长度。M表示列长度,M的范围是0-255个字符。例如,CHAR(4)定义了一个固定长度的字符串列,其包含的字符个数最大为4。当检索到CHAR值时,尾部的空格将被删除。


2、VARCHAR


VARCHAR(M)是长度可变的字符串,M表示最大列长度。M的范围是0~-65535. VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加1。例如,VARCHAR(50)定义了一个最大长度为 50的字符串, 如果插入的字符串只有 10个字符,则实际存储的字符串为10个字符和一一个字 符串结束字符。VARCHAR在值保存和检索时尾部的空格仍保留。


创建tmp8表,定义字段ch和vch数据类型依次为CHAR(4)、VARCHAR(4)向表中插入数据“ab ”,SQL语句如下:

创建表tmp8:

mysql> CREATE TABLE tmp8(
    -> ch  CHAR(4),
    -> vch  VARCHAR(4)
    -> );
Query OK, 0 rows affected (0.01 sec)

输入数据:

mysql> INSERT INTO tmp8 VALUES('ab  ', 'ab  ');
Query OK, 1 row affected (0.00 sec)


查询结果:

mysql> SELECT concat('(', ch, ')'), concat('(',vch,')') FROM tmp8;
+----------------------+---------------------+
| concat('(', ch, ')') | concat('(',vch,')') |
+----------------------+---------------------+
| (ab)                 | (ab  )              |
+----------------------+---------------------+
1 row in set (0.00 sec)

3、TEXT


TEXT列保存非二进制字符串,如文章内容、评论等。当保存或查询TEXT列的值时,不删除尾部空格。Text类型分为4种: TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT.不同的TEXT类型的存储空间和数据长度不同。


4、ENUM


ENUM是一个字符串对象, 其值为表创建时在列规定中枚革的一列值。 请法格式如下:

字段名ENUM(‘值1’, 值2…值n’)


其中,“字段名” 指将要定义的字段,“值 n”指枚举列表中的第n个值。ENUM 类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取个。 创建的成员中有空格时, 其尾部的空格将自动被删除。ENUM值在内部用整数表示,并且每个枚举值均有一个索引值:列表值所允许的成员值从1开始编号,MySQL存储的就是这个索引编号。枚举最多可以有65535个元素。


创建表tmp9,定义ENUM类型的列enm(‘first’,‘second’,‘third’),查看列成员的索引值,SQL语句如下

:首先,创建tmp9表:


mysql> CREATE TABLE tmp9( enm ENUM('first','second','third') );
Query OK, 0 rows affected (0.01 sec)


插入各个列值:


mysql> INSERT INTO tmp9 values('first'),('second') ,('third') , (NULL);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

查看索引值:


SELECT enm, enm+0 FROM tmp9;
mysql> SELECT enm, enm+0 FROM tmp9;
+--------+-------+
| enm    | enm+0 |
+--------+-------+
| first  |     1 |
| second |     2 |
| third  |     3 |
| NULL   |  NULL |
+--------+-------+
4 rows in set (0.00 sec)


创建表tmp10,定义INT类型的soc字段,ENUM类型的字段level,列表值为(‘excellent’,‘good’, ‘bad’),向表tmp10中插入数据(70,‘good’)、(90,1)、(75,2)、(50,3) 、(100,‘best’),SQL语句如下:

首先,创建数据表:

mysql> CREATE TABLE tmp10 (soc INT, level enum('excellent', 'good','bad') );
Query OK, 0 rows affected (0.01 sec)

插入数据:

mysql> INSERT INTO tmp10 values(70,'good'), (90,1),(75,2),(50,3);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0


再次插入数据:


mysql> INSERT INTO tmp10 values (100,'best');
ERROR 1265 (01000): Data truncated for column 'level' at row 1


这里系统提示错误信息,可以看到,由于字符串值“best”不在ENUM列表中,所以对数据进行了阻止插入操作,查询结果如下:


mysql> SELECT * FROM tmp10;
+------+-----------+
| soc  | level     |
+------+-----------+
|   70 | good      |
|   90 | excellent |
|   75 | good      |
|   50 | bad       |
+------+-----------+
4 rows in set (0.00 sec


5、SET


SET是一个字符串对象,可以有零或多个值。SET列最多可以有64个成员,其值为表创建时规定的一列值。 指定包括多个SET成员的SET列值时,各成员之间用逗号()间隔开。语法格式如


SET('值1',值2'.....值n')


与ENUM类型相同,SET值在内部用整数表示,列表中每一个值都有一个索引编号。 当创建表时,SET 成员值的尾部空格将自动被删除。与ENUM类型不同的是,ENUM类型的字段只能从定义的列值中选择一个值插入,而SET类型的列可从定义的列值中选择多个字符的联合。如果插入SET字段中列值有重复,则MySQL自动删除重复的值:插入SET字段的值的顺序并不重要,MySQL会在存入数据库时按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL将忽视这些值,并给出警告。

创建表tmp11,定义SET类型的字段s,取值列表为(‘a’, ‘b’, ‘c’, ‘d’),插入数据(‘a’),(‘a,b,a’),(‘c,a,d’),(‘a,x,b,y’),SQL语句如下:

首先创建表tmp11:

mysql> CREATE TABLE tmp11 ( s SET('a', 'b', 'c', 'd'));
Query OK, 0 rows affected (0.01 sec)


插入数据:

mysql> INSERT INTO tmp11 values('a'),( 'a,b,a'),('c,a,d');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

再次插入数据:


mysql> INSERT INTO tmp11 values ('a,x,b,y');
ERROR 1265 (01000): Data truncated for column 's' at row 1


由于插入了SET列不支持的值,因此MySQL给出错误提示。

查看结果:


mysql> SELECT * FROM tmp11;
+-------+
| s     |
+-------+
| a     |
| a,b   |
| a,c,d |
+-------+
3 rows in set (0.00 sec)


1.5、MySQL二进制类型


前面讲解了存储文本的字符串类型,这一节将讲解MySQL中存储二进制数据的数据类型

BIT、BINARY、VARBINARY、TINYBLOB、

BLOB、MEDIUMBLOB、LONGBLOB,


类型名称 说明 存储需求
BIT(M) 位字段类型 大约(M+7)/8字节
BINARY(M) 固定长度二进制字符串 M字节
VARBINARY(M) 可变长度二进制字符串 M+1字节
TINYBLOB(M) 非常小的BLOB L+1字节,在此L<2^8
BLOB(M) 小BLOB L+2字节,在此L<2^16
MEDIUMBLOB(M) 中等大小的BLOB L+3字节,在此L<2^24
LONGBLOB(M) 非常大的BLOB L+4字节,在此L<2^32


1、BIT类型


BIT类型是位字段类型。M表示每个值的位数,范围为1~64。如果M被省略,默认为1。如果为BIT(M)列分配的值的长度小于M位,

就在值的左边用0填充。例如,为BIT(6)列分配一个值b’101’,其效果与分配b0001相同。BIT 数据类型用来保存位字段值。例如,以二进制的形式保存数据13 (13的二进制形式为1101),在这里需要位数至少为4位的BIT类型,即可以定义列类型为BIT(4),大于二进制1111的数据是不能插入BIT(4)类型的字段中的。


创建表tmp12,定义BIT(4)类型的字段b,向表中插入数据2、9、15、16。

首先创建表tmp12,SQL语句如下:

mysql> CREATE TABLE tmp12( b BIT(4) );
Query OK, 0 rows affected (0.01 sec)


插入数据:

mysql> INSERT INTO tmp12 VALUES(2), (9), (15);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0


查询插入结果:

mysql> SELECT BIN(b+0) FROM tmp12;
+----------+
| BIN(b+0) |
+----------+
| 10       |
| 1001     |
| 1111     |
+----------+
3 rows in set (0.00 sec)


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
5天前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
4天前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
10天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
MySQL 关系型数据库 RDS
RDS for MySQL CPU 性能问题分析
RDS for MySQL CPU 性能问题分析 RDS for MySQL CPU 使用率高是使用 RDS for MySQL 实例过程中比较常见的一类性能问题。 由于实例 CPU 资源打满会直接导致业务受损,且问题发生过程迅速、临界时间短 统计采集困难、问题发生后统计指标呈反向曲线,加之日常运维过程中问题征兆容易被忽视,非常容易导致用户体感问题突然性强烈,因此在这里我们对 RDS for MySQL 的 CPU 使用率高的原因做一个比较详细的分析说明。
2511 57
|
MySQL 关系型数据库 数据库
|
25天前
|
安全 关系型数据库 MySQL
MySQL安全最佳实践:保护你的数据库
本文深入探讨了MySQL数据库的安全防护体系,涵盖认证安全、访问控制、网络安全、数据加密、审计监控、备份恢复、操作系统安全、应急响应等多个方面。通过具体配置示例,为企业提供了一套全面的安全实践方案,帮助强化数据库安全,防止数据泄露和未授权访问,保障企业数据资产安全。
|
10天前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
42 3

推荐镜像

更多