概述

要想学好mysql,了解其支持的基本数据类型以及内部原理是极为重要的,只有这样,我们才能根据不同的业务要求来选择不同的数据类型,实现最佳的存储效果和查询性能,因而本文就着重总结一下mysql支持的数据类型以及内部的存储原理。

总体来说,mysql一共分成了四类:数值类型、日期和时间类型、字符串类型、二进制类型等。

数值类型

数值类型是最为基础的类型,在业务开发中存储递增主键ID、金额、数量等属性时,都会经常选择数值类型来进行存储。整体上将数值类型分为整形、浮点型和定点数类型三类,其中整型对应我们现实生活中常用的整数类型;而浮点型则是对应现实生活中的小数类型;定点数类型则是为了存储精确的小数而被设计出来的。

整型

整型之中,根据是否有符号又被分为无符号数和有符号数,同时不同存储空间以及整数表示范围的考量,整数类型又被分成了TINYINTSMALLINTMEDIUMINTINT以及BIGINT五类,各个类别的类型以及所占空间和含义如下表所示:

类型 占用的存储空间 无符号数的取值范围 有符号数的取值范围 含义
TINYINT 1字节 0~$2^8 $ −27-2^{7}−27~27−12^{7}-127−1 非常小的整数
SMALLINT 2字节 0~216−12^{16}-1216−1 −215-2^{15}−215~215−12^{15}-1215−1 小的整数
MEDIUMINT 3字节 0~224−12^{24}-1224−1 −223-2^{23}−223~223−12^{23}-1223−1 中等大小的整数
INT(别名INTEGER) 4字节 0~232−12^{32}-1232−1 −231-2^{31}−231~231−12^{31}-1231−1 标准的整数,跟Java中的int类型相同
BIGINT 8字节 0~264−12^{64}-1264−1 −264-2^{64}−264~264−12^{64}-1264−1 大整数

具体使用时,为某个变量设定变量类型时加上对应的类型关键字即可;在区分无符号数以及有符号数时,则需要加上UNSIGINED关键字来加以区分,加上该关键字后,则表示使用的无符号数,比如TINYINT UNSIGNED表示的就是无符号TINYINT类型的数。

浮点型

浮点型主要用来存储小数,其实现和存储范围和我们在其他编程语言中学习的类型,分为单精度浮点型(FLOAT)和双精度浮点型(DOUBLE)两类,两者的存储空间和表示范围如下表所示:

类型 占用的存储空间 绝对值最小的非0值 绝对值最大值 含义
FLOAT 4个字节 ±1.175494351E-38 ±4.402823466E+38 单精度浮点型
DOUBEL 8字节 ±2.22507385072014E-308 ±1.7976931348623157E+3008 双精度浮点型

具体浮点数内部的存储原理以及存储范围的确定,感兴趣的同学可以参考之前写的一篇文章《“从内存角度分析浮点数大小比较方法”》此处不再赘述。

从表中可以看到浮点型数据可以将大量十进制小数转成二进制进行存储,但实际存储过程中许多小数存在误差,即存在精度损失。为了解决该问题,在MYSQL中引入了"定点数类型"来进行实现对小数的精确存储。

定点数类型

定点类型作为精确存储小数的方式,它的设计思路和存储原理和浮点数有较大不同,其具体的结构如下表所示:

类型 占用的存储空间 取值范围
DECIMAL(M,D) 取决于M和D的值 取决于M和D的值

从表中可以看出一个定点数类型的数有两部分构成:

  • M:表示该小数最多包含的有效数字个数。比如2.3有效数字个数为2;0.2,有效数字个数为1
  • D:表示该小数保留小数点后十进制数字的个数,简单来讲就是小数的位数。比如2.3中D的值为1;8.321中D的值为3。

在存储时,为了保证定点数不损失小数精度,因而采用如下存储策略:

将十进制小数用小数点分隔开,分别把小数点左右的两个十进制整数存储起来

比如存储8.32时,分别将8和32分开存储,这样就相当于保存了8.32这一精确的小数。

具体使用时,不同的M和D值会影响到存储的小数范围,本着“能少用存储空间就少用存储空间”的原则,mysql在设计时,采用如下策略来对DECIMAL(M,D)数据类型分配存储空间,存储数据。我们以DECIMAL(16,4)为例:

  • 第一步 划分位数:首先按照M和D的大小来划分,整数位和小数位,在本例中,总的有效数字位数为16,可存储的小数位数为4,可存储的整数位数为12。划分的示意图如下图所示:(注意在本图中,每一个方格代表的是十进制位而不是二进制位。)
    概述
    要想学好mysql,了解其支持的基本数据类型以及内部原理是极为重要的,只有这样,我们才能根据不同的业务要求来选择不同的数据类型,实现最佳的存储效果和查询性能,因而本文就着重总结一下mysql支持的数据类型以及内部的存储原理。

总体来说,mysql一共分成了四类:数值类型、日期和时间类型、字符串类型、二进制类型等。

数值类型
数值类型是最为基础的类型,在业务开发中存储递增主键ID、金额、数量等属性时,都会经常选择数值类型来进行存储。整体上将数值类型分为整形、浮点型和定点数类型三类,其中整型对应我们现实生活中常用的整数类型;而浮点型则是对应现实生活中的小数类型;定点数类型则是为了存储精确的小数而被设计出来的。

整型
整型之中,根据是否有符号又被分为无符号数和有符号数,同时不同存储空间以及整数表示范围的考量,整数类型又被分成了TINYINT、SMALLINT、MEDIUMINT、INT以及BIGINT五类,各个类别的类型以及所占空间和含义如下表所示:

类型 占用的存储空间 无符号数的取值范围 有符号数的取值范围 含义
TINYINT 1字节 0~2^8 \ -2{7}~2{7}-1
非常小的整数
SMALLINT 2字节 0~2{16}-1\ -2{15}~2^{15}-1\ 小的整数
MEDIUMINT 3字节 0~2{24}-1\ -2{23}~2^{23}-1\ 中等大小的整数
INT(别名INTEGER) 4字节 0~2{32}-1\ -2{31}~2^{31}-1\ 标准的整数,跟Java中的int类型相同
BIGINT 8字节 0~2{64}-1\ -2{64}~2^{64}-1\ 大整数
具体使用时,为某个变量设定变量类型时加上对应的类型关键字即可;在区分无符号数以及有符号数时,则需要加上UNSIGINED关键字来加以区分,加上该关键字后,则表示使用的无符号数,比如TINYINT UNSIGNED表示的就是无符号TINYINT类型的数。

浮点型
浮点型主要用来存储小数,其实现和存储范围和我们在其他编程语言中学习的类型,分为单精度浮点型(FLOAT)和双精度浮点型(DOUBLE)两类,两者的存储空间和表示范围如下表所示:

类型 占用的存储空间 绝对值最小的非0值 绝对值最大值 含义
FLOAT 4个字节 ±1.175494351E-38 ±4.402823466E+38 单精度浮点型
DOUBEL 8字节 ±2.22507385072014E-308 ±1.7976931348623157E+3008 双精度浮点型
具体浮点数内部的存储原理以及存储范围的确定,感兴趣的同学可以参考之前写的一篇文章《“从内存角度分析浮点数大小比较方法”》此处不再赘述。

从表中可以看到浮点型数据可以将大量十进制小数转成二进制进行存储,但实际存储过程中许多小数存在误差,即存在精度损失。为了解决该问题,在MYSQL中引入了"定点数类型"来进行实现对小数的精确存储。

定点数类型
定点类型作为精确存储小数的方式,它的设计思路和存储原理和浮点数有较大不同,其具体的结构如下表所示:

类型 占用的存储空间 取值范围
DECIMAL(M,D) 取决于M和D的值 取决于M和D的值
从表中可以看出一个定点数类型的数有两部分构成:

M:表示该小数最多包含的有效数字个数。比如2.3有效数字个数为2;0.2,有效数字个数为1

D:表示该小数保留小数点后十进制数字的个数,简单来讲就是小数的位数。比如2.3中D的值为1;8.321中D的值为3。

在存储时,为了保证定点数不损失小数精度,因而采用如下存储策略:

将十进制小数用小数点分隔开,分别把小数点左右的两个十进制整数存储起来

比如存储8.32时,分别将8和32分开存储,这样就相当于保存了8.32这一精确的小数。

具体使用时,不同的M和D值会影响到存储的小数范围,本着“能少用存储空间就少用存储空间”的原则,mysql在设计时,采用如下策略来对DECIMAL(M,D)数据类型分配存储空间,存储数据。我们以DECIMAL(16,4)为例:

第一步 划分位数:首先按照M和D的大小来划分,整数位和小数位,在本例中,总的有效数字位数为16,可存储的小数位数为4,可存储的整数位数为12。划分的示意图如下图所示:(注意在本图中,每一个方格代表的是十进制位而不是二进制位。)

mysql基本数据类型.png

第二步 分组:从小数点位置开始,分别向两边进行分组操作,将每个整数每隔9个十进制位划分成一组,划分结果如下图所示:

mysql基本数据类型-第 2 页.png

从图中可以看到,在分组时,如果不够9个十进制位,那么最终也会被单独划分成一组,比如第一组和第三组。

第三步 转换二进制:针对每个组中的十进制数字,分别将其转成二进制数字进行存储。为了有效利用存储空间,在存储时组中包含的十进制数字位数同步,则所占用的存储空间也不同,具体对应关系表如下:

组中包含的十进制位数 占用存储空间 备注
1或2 1字节 最多需要存储十进制数99,一个字节可存储范围为(-128,127)满足要求
3或4 2字节 最多需要存储十进制数9999,两个字节可存储范围为(-32,768,32,767)满足要求
5或6 3字节 最多需要存储十进制数999,999,三个字节可存储范围为(-8,388,608,8,388,607)满足要求
7或8或9 4字节 最多需要存储十进制数999,999,999,4个字节可存储范围(-2,147,483,648,2,147,483,647)满足要求
从表中可以看出,在选择存储位数时,可表示的存储范围实际上是大于需要表示的数字范围的,因此此种存储方案是可行的的。当然有的小伙伴会问了,似乎这样存储是有空间浪费的?这也是没办法的事情,只能通过牺牲空间来缓存存储精度了,在工程实践中经常也会有这种tradeoff

MySQL各数据类型总结相关推荐

  1. 再谈MySQL JSON数据类型

    2019独角兽企业重金招聘Python工程师标准>>> 本文首发微信公众号<andyqian>.期待你的关注- 前言 眨眼间,有一小段时间没有更新文章了.唉,又懒了... ...

  2. MySQL 字段数据类型/长度

    分类: 数据库学习2010-09-27 16:30 105人阅读 评论(0) 收藏 举报 一.MySQL 字段数据类型/长度 1.数值类型 列类型              需要的存储量 TINYIN ...

  3. MySQL日期数据类型、时间类型使用总结

    转载链接:http://www.jb51.net/article/23966.htm MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围 ----- ...

  4. mysql 变量 数据类型_浅谈mysql(二)数据类型

    //我...我才是不是傲娇呢 //如有问题还请多多指教.上回我们说到我们如何使用MySQL,关键是要看它的用途.用途衍生语句.之后文章的思路,也是如此,从用途出发,然后再到语句. 那么,我们先问几个问 ...

  5. 2Python全栈之路系列之MysQl基本数据类型

    Python全栈之路系列之MySQL基本数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类: 数字类型 日期和时间类型 字符串类型 数字类 ...

  6. mysql中数据类型的长度

    一.varchar(n).char(n)中的n的含义 1)varchar(m),char(n)里面的m或n代表的是字符的个数. 打开mysql手册,看到这样一句话 The CHAR and VARCH ...

  7. MySQL常用数据类型

    MySQL常用数据类型 1.整数类型.浮点数类型.定点类型 (1)整数类型(默认的是有符号的) 整数类型 字节数 无符号(unsigned)范围 有符号(signed)范围 tinyint 1 0-2 ...

  8. mysql空间数据类型解释_MySQL空间数据类型

    MySQL空间数据类型讲解 MySQL具有与OpenGIS类对应的数据类型.某些类型只能保存单个几何值: GEOMETRY POINT LINESTRING POLYGON GEOMETRY能够保存任 ...

  9. MySQL不同数据类型如何表示_MySQL系列(二)--数据类型

    如何选择优化的数据类型: 当一个列有多种数据类型可以选择,选择顺序:数字类型.日期/二进制类型.字符类型,相同级别的数据类型,优先选择占用空间小的类型 1.通常更小的更好 相同级别的数据类型,选择占据 ...

  10. MySQL之数据类型、建表和六大约束

    前言:昨天跟大家分享了MySQL的账号管理.建库及四大引擎,今天与大家分享的知识是MySQL之数据类型.建表和六大约束. 一.数据类型介绍 1.作用:MySQL中定义数据字段的类型对你数据库的优化是非 ...

最新文章

  1. php开启curl扩展
  2. Spring Boot 发送邮件
  3. CODING 最佳实践:快课网研发效能提升之路 1
  4. APP支付报错ALI40247处理方案!
  5. 号外!德国惊现大罢工--要求每周上班28小时
  6. C++——二维vector初始化
  7. python输出斐波那契数列_Python实现斐波那契数列
  8. Android超声波识别技术,超声波指纹识别or光学指纹识别?屏下指纹识别技术大比拼-传感技术-与非网...
  9. Web前端大作业—— 饮食餐饮网站 咖啡网站pc端带轮播(5个页面)HTML+CSS+JavaScript 学生美食网页设计作品 学生餐饮文化网页模板
  10. 【重温C/C++】explicit+||template||virtual虚函数||重载和重写
  11. php mysql persistent_PHP API中,MYSQL与MYSQLI的持久连接区别
  12. 调研:暴恐识别(图像识别)by_xxzcc
  13. c html保存为图片格式,【单选题】在 IE 中,若要把整个网页的文字和图片一起保存在一个文件中,则文件的类型应为 。 A. HTM B. HTML C. MHT D. TXT...
  14. 2017年哈工大数理逻辑B期末考试参考答案(1)
  15. python发送excel文件_如何在Python中使用Excel文件(xlsx)附件发送电子邮件
  16. 关系数据库设计五大范式学习记录——<五>
  17. 全球最大同性交友平台的“黑历史”
  18. 天池AI大赛 智能制造预测赛题
  19. ubuntu无法添加PPA的解决办法
  20. Excel表格自动转Json数据

热门文章

  1. yqsc是什么意思_qsc的含义,qsc是什么的缩写,qsc的词语,qsc代表的意思
  2. SpringBoot 实现邮件发送功能
  3. 扫地机器人 杂牌_扫地机器人哪个牌子好?国产扫地机器人排行榜
  4. VS 给自己开发的Qt程序加上程序图标ico
  5. 杭电oj —— 2026
  6. # 互信息最大化[视角统一]:Align before Fuse: Vision Language Representation Learning with Momentum Distillation
  7. NYIST 708 ones java
  8. 外贸软件之冷冻食品进口贸易管理系统
  9. 考研英语 长难句训练day33
  10. java数字时钟_Java实现动态数字时钟