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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 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数据库的数据类型的方法。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
关系型数据库 MySQL 分布式数据库
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
37 2
|
3天前
|
SQL 存储 关系型数据库
数据库开发之mysql前言以及详细解析
数据库开发之mysql前言以及详细解析
14 0
|
2天前
|
关系型数据库 MySQL 数据库
一台MySQL数据库启动多个实例
一台MySQL数据库启动多个实例
|
7天前
|
SQL 监控 druid
Druid数据库连接池简介及应用推广(老项目翻出来做下记录)
Druid数据库连接池简介及应用推广(老项目翻出来做下记录)
|
8天前
|
SQL 关系型数据库 MySQL
MySQL环境搭建——“MySQL数据库”
MySQL环境搭建——“MySQL数据库”
|
8天前
|
SQL NoSQL 关系型数据库
初识MySQL数据库——“MySQL数据库”
初识MySQL数据库——“MySQL数据库”
|
10天前
|
关系型数据库 MySQL 数据库
数据库基础(mysql)
数据库基础(mysql)
|
22天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
105 0
|
22天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
22天前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)