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

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

2、 BINARY和VARBINARY类型


BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是它们包含二进制字节

字符串。其使用的语法格式如下:


列名称BINARY (M)或者VARBINARY (M)


BINARY类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充‘\0’齐以达到指定长度。例如:指定列数据类型为BINARY(3),当插入‘a’时,存储的内容实际为“a\0\0",当插入“ab” 时,实际存储的内容为“ab\0”,不管存储的内容是否达到指定的长度,其存储空间


VARBINARY类型的长度是可变的,指定好长度之后,其长度可以在0到最大值之间。例如: 指定列数据类型为VARBINARY(20),如果插入的值的长度只有10,则实际存储空间为10加1,即实际占用的空间为字符串的实际长度加1。


创建表tmp13,定义BINARY(3)类型的字段b和VARBINARY(3)类型的字段vb,并向表中插入数据’5’,比较两个字段的存储空间。

首先创建表tmp13,输入SQL语句如下:


mysql> CREATE TABLE tmp13(
    -> b binary(3),
    -> vb varbinary(30)
    -> );
Query OK, 0 rows affected (0.01 sec)

插入数据:


mysql> INSERT INTO tmp13 VALUES(5,5);
Query OK, 1 row affected (0.00 sec)


查看两个字段存储数据的长度:

mysql> SELECT length(b), length(vb) FROM tmp13;
+-----------+------------+
| length(b) | length(vb) |
+-----------+------------+
|         3 |          1 |
+-----------+------------+
1 row in set (0.00 sec)
mysql> SELECT b,vb,b = '5', b='5\0\0',vb='5',vb = '5\0\0' FROM tmp13;
+------------+------------+---------+-----------+--------+--------------+
| b          | vb         | b = '5' | b='5\0\0' | vb='5' | vb = '5\0\0' |
+------------+------------+---------+-----------+--------+--------------+
| 0x350000   | 0x35       |       0 |         1 |      1 |            0 |
+------------+------------+---------+-----------+--------+--------------+
1 row in set (0.00 sec)


3、BLOB类型


BLOB是一个二进制大对象,用来存储可变数量的数据。BLOB类型分为4种: TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们可容纳值的最大长度不同,如下所示:


数据类型 存储范围
TINYBLOB 最大长度为255 (2^8-1) B
BLOB 最大长度为65535 (2^6-1) B
MEDIUMBLOB 最大长度为16777215 (2^24-1) B
LONGBLOB 最大长度为4294967295 (2^32 -1) B


BLOB列存储的是二进制字符串,

TEXT列存储的是非二进制字符串。

BLOB列没有字符集,并且排序和比较基于列值字节的数值;

TEXT列有一个字符集,并且根据字符集对值进行排序和比较。


2、 如何选择数据类型


2.1、MySQL整数与浮点数的选择


如果不需要小数部分,就使用整数来保存数据:如果需要表示小数部分,就使用浮点数类型。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入。例如,假设列的值的范围为1~99999,若使用整数,则MEDIUMINT UNSIGNED是最好的类型;若需要存储小数,则使用FLOAT类型。浮点类型包括FLOAT和DOUBLE类型。DOUBLE类型精度比FLOAT类型高,因此要求存储精度较高时应选择DOUBLE类型。


2.2、MySQL浮点数与定点数的选择


浮点数FLOAT、DOUBLE相对于定点数DECIMAL的优势是:在长度一定的情况下, 浮点数能表示更大的数据范围。由于浮点数容易产生误差,因此对精确度要求比较高时,建议使用DECIMAL来存储。DECIMAL在MySQL中是以字符串存储的,用于定义货币等对精确度要求较高的数据。在数据迁移中,float(M,D)是 非标准SQL定义,数据库迁移可能会出现问题,最好不要这样使用。另外,两个浮点数进行减法和比较运算时也容易出问题,因此在进行计算的时候,一定要小心。进行数值比较时,最好使用DECIMAL类型。


2.3、MySQL日期与时间类型的选择


MySQL对于不同种类的日期和时间有很多数据类型,比如YEAR和TIME。如果只需要记录年份,则使用YEAR类型即可;如果只记录时间,则使用TIME类型。如果同时需要记录日期和时间,则可以使用TIMESTAMP或者DATETIME类型。由于TIMESTAMP列的取值范围小于DATETIME 的取值范围,因此存储范围较大的日期最好使用

DATETIME.TIMESTAMP也有一个DATETIME不具备的属性。默认的情况下,当插入一条记录但并没有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。因此当需要插入记录的同时插入当前时间时,使用TMESTAMP是方便的。另外,TIMESTAMP 在空间上比DATETIME更有效。


2.4、MySQL的CHAR和VARCHAR之间的选择


CHAR是固定长度字符,VARCHAR 是可变长度字符。CHAR 会自动删除插入数据的尾部空格,VARCHAR 不会删除尾部空格。CHAR是固定长度,所以它的处理速度比VARCHAR的速度要快,但是它的缺点是浪费存储存储引擎对于选择CHAR和VARCHAR的影响:对于MyISAM存储引擎:最好使用固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索更快,用空间换时间。

对于InnoDB存储引擎:使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照实际的长度存储的,比较节省空间,所以对磁盘I/O和数据存储总量比较好。


2.5、MySQL的ENUM和SET的选择


ENUM只能取单值,它的数据列表是一个枚举集合。 它的合法取值列表最多 允许有65535个成员。因此,在需要从多个值中选取一个时, 可以使用ENUM。比如:性别字段适合定义为ENUM类型,每次只能从‘男’或‘女’中取一个值。SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。在需要取多个值的时候,适合使用SET类型,比如要存储一个人的兴趣爱好,最好使用SET类型。ENUM和SET的值是以字符串形式出现的,但在内部,MySQL 是以数值的形式存储它们的。



2.6、MySQL的BLOB和TEXT的选择


BLOB是二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息。BLOB 主要

存储图片、音频信息等,而TEXT只能存储纯文本文件。


3、综合案例-MySQL数据库的数据类型的使用


1、案例要求


创建数据库myData,按照下面数据表格的要求创建数据表:myTable。

myTable表结构


字段名 数据类型 主键 外键 非空 唯一 自增
myInt INT(10)
myFloat FLOAT(5,2)
myTime TIME
myChar CHAR(10)
myBinary binary(5)



通过MySQL数据库的数据类型的使用,来达到掌握有关MySQL数据库的数据类型使用的能力。其具体要求如下所示:

1、创建数据库myData

2、创建数据表myTable

3、向数据表myTable插入INT类型数据

4、向数据表myTable插入FLOAT类型数据

5、向数据表myTable插入TIME类型数据

6、向数据表myTable插入CHAR类型数据

7、向数据表myTable插入BINARY类型数据

8、查询数据表myTable的数据


2、案例实现过程


一、cmd环境运行MySQL语句

2.1、创建数据库myData


mysql> CREATE DATABASE myData;
Query OK, 1 row affected (0.00 sec)


2.2、创建数据表myTable

mysql> USE myData;
Database changed
mysql> CREATE TABLE myTable
    -> (
    -> myInt INT(10),
    -> myFloat FLOAT(5,2),
    -> myTime TIME,
    -> myChar CHAR(10),
    -> myBinary BINARY(5)
    -> );
Query OK, 0 rows affected, 2 warnings (0.01 sec)


2.3、向数据表myTable插入INT类型数据


向myInt字段插入数据


mysql> INSERT INTO myTable(myInt) VALUES(666);
Query OK, 1 row affected (0.00 sec)


查询myInt字段结果如下


mysql> SELECT myInt FROM myTable;
+-------+
| myInt |
+-------+
|   666 |
+-------+
1 row in set (0.00 sec)

2.4、向数据表myTable插入FLOAT类型数据


向myFloat字段插入数据


mysql> INSERT INTO myTable(myFloat) VALUES(6.23);
Query OK, 1 row affected (0.00 sec)


查询myFloat字段结果如下

mysql> SELECT myFloat FROM myTable;
+---------+
| myFloat |
+---------+
|    NULL |
|    6.23 |
+---------+
2 rows in set (0.00 sec)


2.5、向数据表myTable插入TIME类型数据


向myTime字段插入数据


mysql> INSERT INTO myTable(myTime) VALUES('10:24:36');
Query OK, 1 row affected (0.00 sec)


查询myTime字段结果如下


mysql> SELECT myTime FROM myTable;
+----------+
| myTime   |
+----------+
| NULL     |
| NULL     |
| 10:24:36 |
+----------+
3 rows in set (0.00 sec)


2.6、向数据表myTable插入CHAR类型数据


向myChar字段插入数据


mysql> INSERT INTO myTable(myChar) VALUES('CHAR');
Query OK, 1 row affected (0.00 sec)


查询myChar字段结果如下

mysql> SELECT myChar FROM myTable;
+--------+
| myChar |
+--------+
| NULL   |
| NULL   |
| NULL   |
| CHAR   |
+--------+
4 rows in set (0.00 sec)

2.7、向数据表myTable插入BINARY类型数据


向myBinary字段插入数据


mysql> INSERT INTO myTable(myBinary) VALUES(3);
Query OK, 1 row affected (0.00 sec)


查询myBinary字段结果如下

mysql> SELECT myBinary FROM myTable;
+--------------------+
| myBinary           |
+--------------------+
| NULL               |
| NULL               |
| NULL               |
| NULL               |
| 0x3300000000       |
+--------------------+
5 rows in set (0.00 sec)

2.8、查询数据表myTable的数据


查询myTable的数据结果如下

mysql> SELECT * FROM myTable;
+-------+---------+----------+--------+--------------------+
| myInt | myFloat | myTime   | myChar | myBinary           |
+-------+---------+----------+--------+--------------------+
|   666 |    NULL | NULL     | NULL   | NULL               |
|  NULL |    6.23 | NULL     | NULL   | NULL               |
|  NULL |    NULL | 10:24:36 | NULL   | NULL               |
|  NULL |    NULL | NULL     | CHAR   | NULL               |
|  NULL |    NULL | NULL     | NULL   | 0x3300000000       |
+-------+---------+----------+--------+--------------------+
5 rows in set (0.00 sec)


2.9、运行过程如下


1、登入数据库,创建数据库和数据表


2cddcd79462e4d76879b9bb70da41816.png

2、向数据表中插入数据和查询数据


275d14ec19eb47f5bd254d17a96f0104.pngab91319d26aa49d499c464643dd529cf.png


二、Navicat 软件环境运行MySQL语句


1、新建查询


进入Navicat软件好,新建一个创建数据库的查询。

在查询中编写如下的SQL语句,如下所示。

-- 1、创建数据库
CREATE DATABASE myData;
-- 2、创建数据表myTable
USE myData;
CREATE TABLE myTable
(
  myInt INT(10),
  myFloat FLOAT(5,2),
  myTime TIME,
  myChar CHAR(10),
  myBinary BINARY(5)
);
-- 3、向数据表myTable插入INT类型数据
-- 向myInt字段插入数据
INSERT INTO myTable(myInt) VALUES(666);
-- 查询myInt字段
SELECT myInt FROM myTable;
-- 4、向数据表myTable插入FLOAT类型数据
-- 向myFloat字段插入数据
INSERT INTO myTable(myFloat) VALUES(6.23);
-- 查询myFloat字段结
SELECT myFloat FROM myTable;
-- 5、向数据表myTable插入TIME类型数据
-- 向myTime字段插入数据
INSERT INTO myTable(myTime) VALUES('10:24:36');
-- 查询myTime字段
SELECT myTime FROM myTable;
-- 6、向数据表myTable插入CHAR类型数据
-- 向myChar字段插入数据
INSERT INTO myTable(myChar) VALUES('CHAR');
-- 查询myChar字段
SELECT myChar FROM myTable;
-- 7、向数据表myTable插入BINARY类型数据
-- 向myBinary字段插入数据
INSERT INTO myTable(myBinary) VALUES(3);
-- 查询myBinary字段
SELECT myBinary FROM myTable;
-- 8、查询数据表myTable的数据
SELECT * FROM myTable;


2、运行过程


运行结果如下所示:


1、创建数据库


44c202ab67024d848284034092c87d27.png


2、创建数据表


23a61154ee6b49f49b83d1620042ff99.png


3、插入和查询数据


2294ca2c0d0e400dad000f21b2b96d8f.png

9370410a15fd4448a58129246c34a345.pngb7dbbfc1962348788165a18e47cb26d8.png


4、总结


本文主要介绍了MySQL数据类型:

MySQL数据类型主要有整数类型、浮点类型、定点类型、日期和时间类型、字符串类型、文本类型和二进制类型。 使读者可以很快掌握MySQL数据类型的基本使用方法。另外还介绍了分别使用cmd环境和Navicat软件环境中使用MySQL数据库的数据类型的方法。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
10天前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
42 3
|
16天前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
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天前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
147 7
|
10天前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
62 6
|
10天前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
57 1
|
10天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
25天前
|
安全 关系型数据库 MySQL
MySQL安全最佳实践:保护你的数据库
本文深入探讨了MySQL数据库的安全防护体系,涵盖认证安全、访问控制、网络安全、数据加密、审计监控、备份恢复、操作系统安全、应急响应等多个方面。通过具体配置示例,为企业提供了一套全面的安全实践方案,帮助强化数据库安全,防止数据泄露和未授权访问,保障企业数据资产安全。

推荐镜像

更多