MySQL数据库基础:数据类型详解-数值类型

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL数据库基础:数据类型详解-数值类型

前言


最近MySQL的技能树已经建成了,一直想要复习一遍MySQL的基础知识,正好趁着这次MySQL技能树的建成一起学习复习一下MySQL数据库的基本知识。也是一直在用这个数据库,有些基础的知识点长久不用就会遗忘,就比如数据类型溢出的问题,很多时候建表的时候随便给定个类似,结果导入数据的时候报错又得删表就很麻烦,如果提前做好数据长度设置可以有效的避免这个问题而且还能节省很多空间,因此对MySQL所有数据类型做个总结是一个值得的选择。


最好的总结方式就是根据学习顺序整理出一张思维导图可以帮我们很快的梳理清楚思路:


29432a20a36c4981b1bde13dab860031.png


该系列文章将按照这个脉络行文,此系列文章将被纳入我的专栏一文速学SQL各类数据库操作,基本覆盖到使用SQL处理日常业务以及常规的查询建库分析以及复杂操作方方面面的问题。从基础的建库建表逐步入门到处理各类数据库复杂操作,以及专业的SQL常用函数讲解都花费了大量时间和心思创作,如果大家有需要从事数据分析或者数据开发的朋友推荐订阅专栏,将在第一时间学习到最实用常用的知识。此篇博客篇幅较长,值得细读实践一番,我会将精华部分挑出细讲实践。博主会长期维护博文,有错误或者疑惑可以在评论区指出,感谢大家的支持。


MySQL中的数值类型包括整数类型、浮点数类型和定点数类型。


99ab0ca2136042b790bb13b984610e61.png


一、整数类型


MySQL的整数类型以下五种:


整数类型 类型名称 存储空间
TINYINT 非常小的整数 1个字节
SMALLINT 小整数 2个字节
MEDIUMINT 中型大小的整数 3个字节
INT(INTEGER) 一般大小的整数 4个字节
BIGINT 很大的整数 8个字节



在实际工作中,需要根据实际情况选择合适的整数类型。

不同的整数类型除了所需的存储空间不同外,所表示的数值范围也是不同的。不同的整数类型所表示的数值。同一种整数类型,有符号与无符号所表示的数值范围也不同。其中,有符号整数的最小值是一个负数,无符号整数的最小值是0。


543ba5cf9d7841548606b1a88ab80cd9.png


如果使用的数据类型超出了整数类型的范围,则MySQL会抛出相应的错误。因此在实际使用的时候,应该首先确认好数据的取值范围,然后根据确认的结果选择合适的整数类型。


INT整数型


现在我们在mysql里面展示一下如何使用:


create table mytable1(id INT);

8a8cea6a812f406da6d54bd995c67495.png


实际上,MySQL在执行建表语句时,int类型默认的显示宽度为11。也可以在创建数据表的时候指定数据的显示宽度。


宽度问题


创建数据表t2,将INT类型的字段id的显示宽度设置为6。

82a9bd92daa9473f827862a4a6532005.png


注意:整数类型的显示宽度与数据类型的取值范围无关。显示宽度只是指定最大显示的数字个数,如果在数据表中插入了大于显示宽度,但是并没有超过整数类型的数值范围的数据,依然可以正确地插入数据,并且能够正确地显示。


插入两条数据,一条数据没有超出显示的宽度6,另一条数据超出了显示的宽度6。


INSERT INTO mytable2(id) VALUES (1), (1111111);

c60a7f804146453ca58353c37e337a2d.pngcd5ca02a058d4bec95921611a52abb8d.png

数字1并没有超出id字段的显示宽度,数字1111111超出了id字段的显示宽度。虽然在创建数据表的时候设置了id字段的显示宽度为6,但是数字1111111并没有超出INT类型表示的数值范围,因此依然能够正确地插入数据库中并显示。


ZEROFILL自动填充


整数类型的显示宽度能够配合ZEROFILL使用。ZEROFILL表示在数字的显示位数不够时,可以用字符0进行填充。


CREATE TABLE mytable3(id1 INT ZEROFILL, id2 INT(6) ZEROFILL);


向数据表中插入数据:


INSERT INTO mytable3(id1, id2) VALUES(1, 1);

9e64918160d9439ea164deee3cc783ea.png


当插入的数字小于设置的显示宽度时,使用字符0进行了填充。


当整数类型设置了显示宽度并且使用字符0填充时,如果向数据表中插入时超出了显示宽度,但是并没有超出整数类型范围的数字时,MySQL也不会报错,原因是插入的数字超出了显示宽度,无须再用字符0进行填充。


所有的整数类型都有一个可选的属性UNSIGNED(无符号属性),无符号整数类型的最小取值为0。所以,如果需要在MySQL数据库中保存非负整数值时,可以将整数类型设置为无符号类型。特别地,如果在MySQL中创建数据表时,指定数据字段为ZEROFILL,则MySQL会自动为当前列添加UNSIGNED属性。


acc6e4d5d6bf4bd2a3ddc9d2d8e9b220.png


在创建数据表t3时并没有指定id1字段和id2字段的属性UNSIGNED,而只是为id1字段和id2字段指定了ZEROFILL,此时,MySQL自动为id1和id2添加了UNSIGNED属性。


在MySQL中,整数类型还有一个属性是AUTO_INCREMENT。AUTO_INCREMENT的值一般从1开始,每行自动加1。如果在标识为AUTO_INCREMENT的整数列中插入NULL,则MySQL会在此列中插入一个比该列当前最大值大1的数值。


AUTO_INCREMENT自增


一个表中最多只能有一个列被设置为AUTO_INCREMENT。设置为AUTO_INCREMENT的列需要定义为NOT NULL,并且定义为PRIMARY KEY,或者定义为NOT NULL并且定义为UNIQUE。

CREATE TABLE mytable4(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  age int
  );

7b48bb5c7cee410d9202112dc919079d.png


我们直插入age数据:


INSERT INTO mytable4 (age) values(18),(20),(16);


33af5cdc616e4eba8d901d03a40275b1.png


MySQL自动为AUTO_INCREMENT类型的整型列设置了自动递增的整数值。


也可以将设置为AUTO_INCREMENT的整型列定义为UNIQUE,并没有将id字段设置为主键,而是将id字段设置为唯一索引,此时向数据表5中插入数据

742c014cc0514fe4a1777a151229e862.png


MySQL同样为设置为AUTO_INCREMENT的整型列id设置了自动递增的整数值。

其他整数类型的用法与INT类型相同!


二、浮点数类型


浮点数类型主要有两种:单精度浮点数FLOAT和双精度浮点数DOUBLE。


image.png

单精度浮点数FLOAT类型占用4个字节的存储空间,双精度浮点数DOUBLE类型占用8个字节的存储空间。


对于浮点数来说,有符号与无符号所表示的数值范围也是不同的。

2c9407510265485389d721c47ea84c2b.png

浮点数类型中的FLOAT和DOUBLE类型在不指定数据精度时,默认会按照实际的计算机硬件和操作系统决定的数据精度进行显示。如果用户指定的精度超出了浮点数类型的数据精度,则MySQL会自动进行四舍五入操作。

CREATE TABLE mytable6(
  f FLOAT,
  d DOUBLE
  );


c2fad914e822440f9136f3e89a3326c8.png


INSERT INTO mytable6 (f, d) VALUES (3.14, 5.98);

0e28dd0747cd46448fb1bb0c682e066e.png

如果我们插入一些插入超出数据类型精度的数据:


INSERT INTO mytable6 (f, d) VALUES (3.144444444444444, 5.9899999999999999);

b9d052a851f949d4bce1a8b8ef284b3d.png


可以看到,为FLOAT类型和DOUBLE类型插入超出数据类型精度的数据时,MySQL对插入的数据进行了四舍五入处理。


精度与标度


对于浮点数来说,可以使用(M,D)的方式进行表示,(M,D)表示当前数值包含整数位和小数位一共会显示M位数字,其中,小数点后会显示D位数字,M又被称为精度,D又被称为标度。

CREATE TABLE mytable7 (
      f FLOAT(5,2),
      d DOUBLE(5,2)
      );

再次向7表中插入数据,此时在f字段中插入数值3.141,在d字段中插入数值3.14。


INSERT INTO mytable7 (f, d) VALUES (3.141, 3.14);

84a32f524a62473c9ef25066ba89ba06.png

FLOAT类型的字段f,由于标度的长度限制,最后一位数字被舍弃了,最终插入数据库中的数值为3.14。当双精度DOUBLE类型的数据设置了精度和标度时,由于标度的限制,同样会舍弃超出标度限制的数字。


综上所述,浮点数不写精度和标度时,会按照计算机硬件和操作系统决定的数据精度进行显示。如果用户指定的精度超出了浮点数类型的数据精度,则MySQL会自动进行四舍五入操作,数据能够插入MySQL中,并能够正常显示。


三、定点数类型


MySQL中的定点数类型只有DECIMAL一种类型。DECIMAL类型也可以使用(M,D)进行表示,其中,M被称为精度,是数据的总位数;D被称为标度,表示数据的小数部分所占的位数。定点数在MySQL内部是以字符串的形式进行存储的,它的精度比浮点数更加精确,适合存储表示金额等需要高精度的数据。


DECIMAL(M,D)类型的数据的最大取值范围与DOUBLE类型一样,但是有效的数据范围是由M和D决定的。而DECIMAL的存储空间并不是固定的,由精度值M决定,总共占用的存储空间为M+2个字节。


使用定点数类型表示数据时,当数据的精度超出了定点数类型的精度范围时,则MySQL同样会进行四舍五入处理。


当DECIMAL类型不指定精度和标度时,其默认为DECIMAL(10,0)。


我们现在来建表实验一波:


CREATE TABLE mytable8 (
    d1 DECIMAL,
    d2 DECIMAL(5, 2)
     );

8f267b757aa74887b30f687d410a965e.png

在创建数据表8时并没有为d1字段设置精度和标度,此时,MySQL会自动为d1字段设置精度为10,标度为0。


再来插入试试看:

INSERT INTO mytable8 (d1, d2) VALUES (3.14, 3.14); 

545780edfd834844b1ba2b0b6c97ef72.png

在插入数据时,d1字段的值为3,d2字段的值为3.14,再次证明了当创建数据表时,如果不给DECIMAL类型的字段设置精度和标度,则DECIMAL默认的精度为10,标度为0。此时,向数据表中插入数据会舍弃所有小数部分。


INSERT INTO mytable8 (d1, d2) VALUES (1, 3.141);

ead9d5efe1c247e3918a56cf7805e042.png


d2字段中的值,由于精度和标度的限制也被截断了。也就是说,在定点数类型中,如果小数位数超出了标度的限制,则会被截断处理。


对比浮点数类型和定点数类型,可以总结出如下不同之处:


·浮点数类型中的FLOAT类型和DOUBLE类型在不指定精度时,默认会按照计算机硬件和操作系统决定的精度进行表示;而定点数类型中的DECIMAL类型不指定精度时,默认为DECIMAL(10,0)。


·当数据类型的长度一定时,浮点数能够表示的数据范围更大,但是浮点数会引起精度问题,不适合存储高精度类型的数据。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
关系型数据库 MySQL 存储
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
167 0
【MySQL】——数据类型及字符集
|
1月前
|
关系型数据库 MySQL
Mysql基础第十九天,使用不同类型的链接
Mysql基础第十九天,使用不同类型的链接
25 0
Mysql基础第十九天,使用不同类型的链接
|
2月前
|
机器学习/深度学习 存储 关系型数据库
MySQL数据库:常用数据类型
【2月更文挑战第7天】
32 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
101 1
|
2月前
|
关系型数据库 MySQL Docker
MySQL 5.7 timestamp类型设置default value为'0000-00-00 00:00:00'报错的解决方法
MySQL 5.7 timestamp类型设置default value为'0000-00-00 00:00:00'报错的解决方法
|
22天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
1天前
|
存储 JSON 关系型数据库
MySQL 数据类型剖析
MySQL 数据类型剖析
|
1月前
|
弹性计算 安全 关系型数据库
rds网络类型选取
云数据库RDS的网络类型选择包括经典网络、专有网络(VPC)、公共网络和私有网络。推荐使用VPC以实现高安全隔离,私有网络增加安全性且节省公网费用。根据业务需求和安全策略选择,如需内部访问选择同一VPC,外部访问则需公网并配以严格安全措施。最新阿里云RDS建议使用VPC并结合安全组、网络ACL和白名单保障安全,通过CEN实现跨地域通信。
17 7
|
1月前
|
存储 JSON 关系型数据库
【mysql】—— 数据类型详解
【mysql】—— 数据类型详解
|
1月前
|
存储 关系型数据库 MySQL
MySQL中常见的存储引擎类型
【2月更文挑战第18天】
49 7