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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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数据库的数据类型的方法。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
20
35
分享
相关文章
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
174 82
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?
TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务,轻松应对海量功率、电能及输入输出数据的实时统计与分析,并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外,taosX 强大的 transform 功能帮助用户完成原始数据的清洗和结构优化,而其零代码迁移能力更实现了历史数据从 TDengine OSS 与 MySQL 到 TDengine 企业版的平滑迁移,全面提升了企业的数据管理效率。本文将详细解读这一实践案例。
34 0
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
232 42
MySQL生产环境迁移至YashanDB数据库深度体验
这篇文章是作者将 MySQL 生产环境迁移至 YashanDB 数据库的深度体验。介绍了 YashanDB 迁移平台 YMP 的产品相关信息、安装步骤、迁移中遇到的各种兼容问题及解决方案,最后总结了迁移体验,包括工具部署和操作特点,也指出功能有优化空间及暂不支持的部分,期待其不断优化。
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
168 25
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等