mysql基本数据类型

2023-11-18

概述

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

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

数值类型

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

整型

整型之中,根据是否有符号又被分为无符号数和有符号数,同时不同存储空间以及整数表示范围的考量,整数类型又被分成了TINYINTSMALLINTMEDIUMINTINT以及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个十进制位划分成一组,划分结果如下图所示:

image.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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql基本数据类型 的相关文章

  • Jupyter 笔记本中未显示绘图

    我正在尝试为 Anscombe 数据集创建 2x2 图 加载数据集并分离数据集中的每个类 import seaborn as sns import matplotlib pyplot as plt anscombe sns load dat
  • php echo 不工作

    我的代码似乎不起作用 单选按钮出现 但旁边什么也没有 似乎 mysql fetch array 由于某种原因无法工作 因为我已经玩过代码并反复测试它以查找代码似乎遇到的位置出现问题并停止工作 有人可以告诉我出了什么问题吗 欢呼声我是新手 最
  • Java MYSQL/JDBC 查询从缓存的连接返回过时的数据

    我一直在 Stackoverflow 中寻找答案 但似乎找不到不涉及 Hibernate 或其他数据库包装器的答案 我直接通过 Tomcat 6 Java EE 应用程序中的 MYSQL 5 18 JDBC 驱动程序使用 JDBC 我正在缓
  • 用于 OAuth 身份验证的 WSGI 中间件

    我使用构建了一个非常小的网络应用程序Flask http flask pocoo org 现在我想向网站添加非常基本的身份验证 我不需要授权 由于 Flask 不支持开箱即用的 auth auth 我想插入 WSGI 中间件来完成这项工作
  • Tornado:DummyFuture 不支持结果阻塞

    我试图获得一个非常简单的初始服务器 它可以 异步 获取 url 来工作 但它会抛出 Exception DummyFuture does not support blocking for results 有这个SO https stacko
  • 有没有办法删除 JShell 中的导入?

    我正在发现 JShell 并且发现默认添加的导入 jshell gt imports import java io import java math import java net import java nio file import j
  • 为什么计算大整数阶乘的“分而治之”方法如此快? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 图标和导航视图之间的左边距

    我必须在图标和图标之间添加左边距NavigationView 如下图中箭头所示 我知道根据谷歌规范 这个边距必须有16dp但我需要改变它 我努力了
  • 运行 Espresso 测试时在 Android studio 中找不到属性 android:forceQueryable

    我已经使用 android studio 录制了我的 Android 应用程序 Espresso 测试记录浓缩咖啡测试选项中Run菜单 在记录的最后 我用自己的文件名保存了测试 单击保存按钮后 IDE 会自动在以下位置创建文件Android
  • 使用 MinGW 链接到 Python

    我不想创建一个嵌入Python解释器的跨平台程序 并用MinGW编译它 但是 Python 二进制发行版没有提供 MinGW 链接的库 仅python32 lib对于 Visual C 并且 Python 源包不提供使用 MinGW 编译的
  • 在进行堆转储后,如何在发生 OutOfMemoryError 时重新启动 JVM?

    我知道关于 XX HeapDumpOnOutOfMemoryError https stackoverflow com q 542979 260805JVM 参数 我也知道 XX OnOutOfMemoryError cmd args cm
  • 获取 pandas 中最后一次出现特定值之后的所有行

    我的数据框看起来像 ID colA 1 B 1 D 2 B 2 D 2 C 我已返回每组中事件 B 最后一次出现后的所有行 输出将是 ID colA 1 D 2 D 2 C 我试过 a df colA str contains B grou
  • ValueError:对于optimize.curve_fit中所需的数组来说对象太深

    我正在尝试拟合化学系统中四个变量 A B C D 的人口增长和衰退的动力学模型 我正在尝试求解以下一组方程 我已将其以矩阵形式附加 方程的矩阵形式 https i stack imgur com ysEdZ png 其中 t 是时间步长 k
  • 隐藏 JTable 临时列

    我正在使用 JTable 显示数据库中的数据 现在我想通过 Jcombobox 过滤我的 jtable 我正在使用 Jcombo 框 其中包含 030 024 045 等值 这些值已在 jtable 中设置为列标题 当我单击组合时 选定的列
  • Spring Data MongoDB 和批量更新

    我正在使用 Spring Data MongoDB 并且想要执行批量更新 就像此处描述的那样 http docs mongodb org manual reference method Bulk find update Bulk find
  • 使 flake8 区分未定义函数和星型导入

    我有一个相当大的项目 我试图在发布之前清理它 但是当我运行 flake8 时 我得到了大量的 F405
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie
  • Selenium Webdriver - 单击多个下拉菜单时出现陈旧元素异常,而 HTML DOM 不会更改

    我尝试自动化一个场景 其中条件是我必须从下拉列表中选择一个选项 然后它旁边有另一个下拉列表 我必须单击下一个下拉列表中的一个选项才能启用按钮 我尝试使用代码 但它仅单击第一个选项 并显示错误为过时的元素引用 元素未附加到页面文档 请帮忙 如
  • ImageIO.read(...) - 非常慢,有更好的方法吗?

    我正在加载大量将在我的应用程序中使用的图标 我计划在服务器启动时从 jar 中加载所有这些 然而 由于数百张图像加起来刚刚超过 9MB 执行此任务仍然需要 30 秒多的时间 我现在正在一个单独的线程中执行此操作 但这让我想知道我是否在代码中
  • 如何将 c_uint 的 ctypes 数组转换为 numpy 数组

    我有以下 ctypes 数组 data ctypes c uint 100 我想创建一个 numpy 数组np data包含来自 ctypes 数组数据的整数值 ctypes 数组显然稍后会填充值 我看到numpy中有一个ctypes接口

随机推荐

  • 第十一届蓝桥杯 ——互质(gcd求最大公约数)

    gcd最大公约数 Rudy的博客 CSDN博客 gcdhttps blog csdn net xiaoyue article details 83239172 ops request misc 257B 2522request 255Fid
  • go语言exec包调用shell命令

    工程中需要用到ffmpeg 想直接用exec包调用shell命令 本来以为很简单 结果折腾了一下午 最后查到了解决方案 假如之前执行报错的语句为 cmd exec Command echo helloworld out err cmd Ou
  • 智能时代悄然到来刷脸支付逐渐成为潮流

    随着人脸识别 人工智能 物联网 大数据等前沿技术的迅速发展 智能时代已悄然到来 刷脸支付也逐渐成为一种潮流 如今 刷脸支付愈发常见 除了乘车刷脸 看病刷脸外 值机 安检 登机也都可以刷脸了 机场不用排长队 不用身份证 仅需一张脸即可登机的刷
  • rabbitmq web界面报错 Access refused

    赋予权限就好了 rabbitmqctl set permissions p 当前登录账户的账号
  • 态势感知与态势理解

    几个星期前 我与我的一个机构同事碰面 讨论了最新的备受瞩目的袭击事件 他向我提到了一个新词 态势理解 在USB提案中做了8个月的工作后 我对催吐流行语并不陌生 这个词立即引起了人们的注意 但是由于我一直在讨论几天 所以这个词本身正在赢得信誉
  • 【MLOps】第 2 章 : MLOps中的人

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 备战2023蓝桥国赛-传纸条

    题目描述 解析 这道题想了我好久 一开始我是想假如只走一条路线 从 1 1 走到 m n 这种问题该怎么解决呢 针对这种问题我是设了dp k i j 表示走了k步到达 i j 的好心程度之和的最大值 然后根据这个来写出转移方程来计算 后面就
  • Nginx 队列双向链表结构 ngx_quene_t

    队列链表结构 队列双向循环链表实现文件 文件 src core ngx queue h c 在 Nginx 的队列实现中 实质就是具有头节点的双向循环链表 这里的双向链表中的节点是没有数据区的 只有两个指向节点的指针 需注意的是队列链表的内
  • JVM安全退出(如何优雅的关闭java服务)

    https tech imdada cn 2017 06 18 jvm safe exit utm source tuicool utm medium referral 背景 用户 货都到了 购物车里怎么还有刚买的东西 what 产品 有用
  • 如何助力金融贷款企业实现精准营销获客

    无论是哪个行业 吸引客户都是核心 许多公司的线下渠道面临着许多障碍 以至于他们不得不采用在线客户获取方法 受影响最大的行业之一是贷款行业 如何获得准确的贷款客户资源 如何赢得客户已经成为企业的一大痛点 过去 信贷员经常使用电话营销 本地促销
  • IP(OSPF综合实验)

    一 实验 1 R4为ISP 其上只能配置IP地址 R4与其他所有直连设备间使用公有IP 2 R3 R5 6 7为MGRE环境 R3为中心站点 3 整个OSPF环境IP地址自定义 4 所有设备均可访问R4的环回 5 减少LSA的更新量 优化
  • apache Commons-beanutils的使用

    1 背景 在java开发过程中 经常会与javabean打交道 像Entity pojo vo dto等等 java应用非常讲究分层架构 因此在各层之间bean的传输与转换非常的繁琐 比如 Student stu new Student s
  • 基于OpenCV的双目测距系统实现

    基于OpenCV的双目测距系统实现 The BinocularMeasure System Based on OpenCV Abstract This passage mainly describes how to measure dist
  • nginx安装配置

    1 nginx下载 http nginx org download 选择对应版本的nginx下载 这里选择 nginx 1 21 6 tar gz 2 环境准备 必备环境 sudo yum install y gcc c 必须下载 3 个依
  • mysql学习笔记(6)_存储过程

    原本觉得掌握最基本的语法就行了 但发现老师最近又提到了存储过程 我觉得有必要学习整理一下 以下是我的简单笔记 存储过程的含义以及优点 含义 一组预先编译号的sql语句的集合 理解成批处理语句 优点 1 提高代码的重用性 2 简化操作 3 减
  • qq机器人如何滑动验证码验证TxCaptchaHelper

    当我们再运行QQ机器人时出现 一下信息 提示需要滑动模块验证 复制上中的url 在浏览器打开 点击开始验证 出现验证图片 打开开发者控制台 一般浏览器快捷键为 F12 切换到 网络 拖到滑块 验证成功后 会出现 在 预览 中会看到ticke
  • 16-2_Qt 5.9 C++开发指南_使用样式表Qss自定义界面

    进行本篇介绍学习前 请先参考链接01 1 Qt工程实践 Qt样式表Qss 后再结合本篇进行融合学习如何使用样式表定义界面 文章目录 1 Qt样式表 2 Qt样式表句法 2 1 一般句法格式 2 2 选择器 selector 2 3 子控件
  • [Unity][Aniamtor&Animation]动画状态机设置自定义脚本StateMachineBehaviour

    对状态机设置自定义脚本StateMachineBehaviour 这种脚本能够实现什么 优点 通过Animator的状态机就可以实现 敌人AI NPC AI 可以在对应状态机 的动画进行 播放 的时候 生成 特效 音效 以及特定的物品 例如
  • Linux源码编译开启cgroup blk限制io性能

    编译选项 内核5 9 General Setup gt Control Group support gt io controller Enable the block layer gt Block layer bio throttling
  • mysql基本数据类型

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