深入浅出MySQL-02-【MySQL支持的数据类型】

文章目录

  • 前言
  • 1.数值类型
  • 2.日期时间类型
  • 3.字符串类型
    • 3.1.CHAR和VARCHAR类型
    • 3.2.ENUM类型
    • 3.3.SET类型
  • 4.JSON类型

前言

环境:

  • Windows11
  • MySQL-8.0.35

1.数值类型

MySQL中的数值类型,如下:

整数类型字节最小值最大值
TINYINT1有符号 -128
无符号 0
有符号 127
无符号 255
SMALLINT2有符号 -32768
无符号 0
有符号 32767
无符号 65535
MEDIUMINT3有符号 -8388608
无符号 0
有符号 8388607
无符号 1677215
INT、INTEGER4有符号 -2147483648
无符号 0
有符号 2147483647
无符号 4294967295
BIGINT8有符号 -9223372036854775808
无符号 0
有符号 9223372036854775807
无符号 18446744073709551615
浮点数类型字节最小值最大值
FLOAT4±1.175494351E-38±3.402823466E+38
DOUBLE8±2.2250738585072014E-308±1.7976931348623157E+308
定点数类型字节描述
DEC(M,D)M+2
DECIMAL(M,D)
M+2最大取值范围与DOUBLE相同,给定DECIMAL的有效取值范围由M和D决定
位类型字节最小值最大值
BIT(M)1~8BIT(1)BIT(64)

整数型,例如 int(5) 表示数值宽度小于5位的时候在数字前面填满宽度,如果不显示宽度,则默认为 int(11)。一般配合zerofill使用,也就是数字位数不够的时候,在前面的空间填充字符“0”。

注意:我自己测试的,应该是数据库版本问题,int类型不指定宽度,默认是 int(10) 的宽度,下面的测试也可以看出。

测试zerofill和int的配合示例,如下:

在这里插入图片描述
可以发现,字段id1和id2前面的空间都填充了0,可能有疑问,如果实际插入的值超过了设置的宽度呢?答案是不会对插入的值有任何影响,还是按照实际的值和精度保存,此时宽度没有任何意义了,左边也没有空间并不会填充任何0,看下面测试:

在这里插入图片描述
id2的int宽度虽然设置 5,但是实际插入的宽度都是 8了,并没有影响还是插入了。

所有的整数类型都有一个可选属性UNSIGNED(无符号),如果字段设置了这个属性,取值范围是正常值的下限取0,上线取原来值的2倍。例如tinyint的有符号取值范围是 -128~127,而无符号的取值范围是 0 ~ 255。

如果一个列指定了 zerofill,MySQL默认为该列加上 UNSIGNED属性。

整数还有一个属性,AUTO_INCREMENT,只能用于整数类型,一般从1开始,每行+1。一个表中最多只能有一个 AUTO_INCREMENT的列。对于任何想要使用这个属性的列,应该定义为NOT NULL,并定义为PRIMARY KEY 或者定义为 UNIQUE 键。

对于小数,MySQL分为 浮点数 和 定点数,浮点数包括 float 单精度 和 double 双精度,而定点数只有 decimal 一种表示。定点数在MySQL内部是以字符串的形式保存的,比浮点数更准确。

浮点数 和 定点数,类型后面的 (M,D),表示该数值一共显示M位数字(整数位+小数位),D表示精度,也就是几位小数。M和D又称为精度和标度。

浮点数不指定精度(精度和标度)时,会按照实际来显示,而decimal不指定精度(精度和标度),默认整数位和小数位为(10,0)。

示例:

类型➡️
测试⬇️
float(5,2)double(5,2)decimal(5,2)
都插入1.231.231.231.23
float和double插入1.236,decimal插入1.231.241.241.23
float和double插入1.234,decimal插入1.231.231.231.23
都插入1.234,参考下图1.231.231.23
三个字段去掉精度,再次都插入1.23,参考下图1.231.231
三个字段去掉精度,再次都插入1.67,参考下图1.671.672

都插入1.234的示例截图如下:

在这里插入图片描述
虽然插入成功了,但是decimal类型的插入返回了警告信息,报告id3被截断。

三个字段去掉精度,都插入1.23示例截图如下:

在这里插入图片描述
仔细看上图,插入的时候依然返回了警告,同上上图中的警告是一样的,id3的值被截断。

三个字段去掉精度,再次都插入1.67的示例截图:

在这里插入图片描述

上面的表格示例以及截图说明:

  • 浮点数不写精度和标度,按照实际精度和标度值展示,指定精度和标度的,标度超出会按照四舍五入后的结果插入。
  • decimal不写精度默认和标度,就是 (10,0),标度超出的会进行四舍五入,然后截断并返回警告。

上面测试的都是标度超出的处理结果,如果精度超出了会怎么样呢?如下:

在这里插入图片描述

对于 位类型 ,这里不多做解释,自行百度。

2.日期时间类型

MySQL中支持的日期时间类型,如下:

日期和时间类型字节最小值最大值
DATE41000-01-019999-12-31
DATETIME81000-01-01 00:00:009999-12-31 23:59:59
TIMESTAMP4197001010800012038年的某个时刻
TIME3-838:59:59838:59:59
YEAR119012155

这些类型的区别:

  • 表示年月日,使用DATE。
  • 表示年月日时分秒,使用DATETIME或者TIMESTAMP,但是两者存在区别,后续说明。
  • 表示时分秒,使用TIME。
  • 表示年份,使用YEAR,比DATE占用空间少。YEAR有2位和4位格式的年表示,默认4位的,允许的值是1901~2155和0000。2位格式中,允许的值是 70~69,表示1970到2069年。MySQL版本从5.5.27开始不再支持2位的表示了
  • DATE、TIME 和 DATETIME是经常使用的三种时间格式。

TIMESTAMP 和 DATETIME的区别,百度看了下,很详细,其实主要还是 TIMESTAMP和时区有关且范围比较小。这里不做详细测试和说明了。

3.字符串类型

MySQL中的字符串类型:

字符串类型字节描述以及存储需求
CHAR(M)MM为0~255之间的整数
VARCHAR(M)M为0~65535之间的整数,值的长度+1个字节
TINYBLOB允许长度 0~255字节,值的长度+1个字节
BLOB允许长度0~65535字节, 值的长度+2个字节
MEDIUMBLOB允许长度0~167772150字节, 值的长度+3个字节
LONGBLOB
TINYTEXT允许长度 0~255字节,值的长度+2个字节
TEXT允许长度0~65535字节, 值的长度+2个字节
MEDIUMTEXT允许长度0~167772150字节, 值的长度+3个字节
LONGTEXT允许长度0~4294967295字节, 值的长度+4个字节
VARBINARY(M)允许长度0~M个字节的变长字节字符串,值的长度+1个字节
BINARY()M允许长度0~M个字节的定长字节字符串

3.1.CHAR和VARCHAR类型

很类似,都是保存较短的字符串,主要区别是存储方式不同:

  • CHAR的长度固定为创建的时候生命的长度,可以从0~255的任意整数。
  • VARCHAR的长度为可变长度,可以从0~65535之间的任意整数。
  • 检索的时候,CHAR列删除尾部的空格,例如 char(4) 插入 'ab ',实际存入的是 ‘ab’,后面的两个空格没有了。而VARCHAR则保留这些空格,varchar(4) 插入 'ab ',实际存入的就是 'ab '。

3.2.ENUM类型

枚举类型,取值范围需要在创建表的时候通过枚举方式显示指定,测试如下:
在这里插入图片描述
如上图可以看出:

  • ENUM类型是忽略大小写的,存入M和f的时候,都转成了大写。
  • 对于插入一个ENUM范围中不存在的值的时候,没有返回警告和报错,而是插入ENUM范围中的第一个值。需要特别注意。
  • ENUM类型只允许从值的集合中选取单个值,不能一次取多个值。

3.3.SET类型

  • 和ENUM类型相似,最主要区别是SET类型一次可以取多个值,而ENUM只能选取一个值。
  • SET类型的取值多个,只要是范围内的就可以,不是范围内的不允许插入。
  • 如果多个取值中存在重复的,例如 ‘a,b,a’,最终写入的结果会去重,也就是 ‘a,b’。需要特别注意

4.JSON类型

MySQL自5.7.8版本开始支持JSON类型,之前都是通过VARCHAR或者TEXT来保存JSON格式的数据,JSON类型特点:

  • JSON类型字段会自动校验是否为JSON格式,如果不是就会报错。
  • MySQL提供了一组操作JSON数据的内置函数,可以方便的提取各类数据,可以修改特定的键值。
  • 优化的存储格式,存储在JSON列中的JSON数据,被转换成内部的存储格式,允许快速读取。

一个JSON元素中,可以是六中类型元素的任意组合,这六中类型是NUMBER、STRING、BOOLEAN、NULL、ARRAY 和 OBJECT。

其中BOOLEAN使用true和false的字面值文本表示。NULL使用NULL的文本AR表示。字符串和日期类型都是使用双引号引起来表示。ARRAY要用中括号引起来。OBJECT的KV要用大括号引起来,其中KEY也要用双引号引起来。下面是几个正确的示例:

// array
["abc", 10, null, true, false]
// object
{"k1": "value1", "k2": 10}
// 
["12:18:29.000000", "2024-04-23", "2024-04-23 16:47:00.000000"]

ARRAY 和 OBJECT 还可以互相嵌套,这个不难理解。

在这里插入图片描述

如上图,正确的json数据被插入,错误的会直接报错。

通过 json_type函数可以查看插入的json数据是哪种类型,如下图:

在这里插入图片描述
json数据类型对于大小写是敏感的(因为json的默认排序规则是utf8mb4_bin),‘x’和‘X’是不同的两个json数据,常见的null、true、false必须是小写的才合法。

通过json_valid函数判断一个json是否合法,如下:

在这里插入图片描述
如果json数据中的value中字符串包含双引号或者单引号,需要使用反斜杠进行转义,例如插入value为 ab"c 的值,如下:
在这里插入图片描述
如上,双反斜杠表示一个反斜杠。类似json_valid 和 json_type等函数,这都是MySQL提供的json相关的函数操作,在后面的深入浅出MySQL-04-【常用函数】中进行说明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/579099.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从 Apache Doris 到 SelectDB Cloud:云原生架构下的弹性能力揭秘

随着云时代的到来,越来越多企业开始在公有云、私有云乃至 K8s 容器平台构建实时数据平台。云计算基础设施的革新,促使着数据仓库朝着云原生的方向发展。而用户日益复杂的业务负载和降本增效的需求,对于系统资源的精细化管理和成本效益等方面提…

64、二分-搜索二维矩阵

思路: 通过使用二分方式,对于每行进行二分,因为每行的最后一个数小于下一行的第一个数,我们就可以依次二分。首先取出行数N,然后从0-N进行二分,如果mid最后一个数小于目标值说明0-mid中没有,舍弃…

36 线程概念

本章重点 1.了解线程概念,理解线程与进程的区别与联系 2.学会现充控制,线程创建,线程终止,线程等待 3.了解现场分离与线程安全 4.学会线程同步 5.学会使用互斥量,条件变量,posix信号量,以及读写…

cnpm安装

npm install -g cnpm --registryhttps://registry.npmmirror.com # 注册模块镜像 npm set registry https://registry.npmmirror.com // node-gyp 编译依赖的 node 源码镜像 npm set disturl https://npmmirror.com/dist // 清空缓存 npm cache clean --force // 安装c…

Linux中的yum和gcc/g++

一、快速认识yum(简单介绍) 在Linux中,我们也要进行工具/指令/程序、安装、检查、卸载等等,需要使用到yum 在Linux中安装软件的方式: 源代码安装——交叉编译的工作rpm包直接安装yum/apt-get yum:yum是我们Linux预…

Androd SharedPreferences 存取key-value键值对的用法小结

文章目录 一、存储数据二、读取数据三、删除数据3.1 删除指定KEY的数据3.2 删除所有数据 四、测试4.1 查找数据文件4.2 查看数据的存储 在开发一个简单Launcher,点击APP按钮后,如无APP绑定,则弹出一个APP选择列表,选择后进行绑定&…

STL--string详解

STL基本内容 string是什么 string实质上是一个对象 string可看作一个串,类似字符数组 可以扩容,可以增删查改 可用下表访问操作符[]引用,修改某值 构造函数 默认构造 拷贝构造:参数为(string 或 char*) 求string对象的长度不…

AI预测体彩排列3第2套算法实战化测试第5弹2024年4月27日第5次测试

今天继续进行新算法的测试,今天是第5次测试。好了,废话不多说了,直接上图上结果。 2024年4月27日体彩排3预测结果 6码定位方案如下: 百位:6、2、1、7、8、9 十位:8、9、4、3、1、0 个位:3、7、8…

【C++】学习笔记——类和对象5

文章目录 二、类和对象14. 日期类的实现15. const成员16. 取地址重载17. 再谈构造函数初始化列表 18. explicit关键字19. static成员 未完待续 二、类和对象 14. 日期类的实现 上一篇我们已经大致将日期类的重要功能都给实现了,这节将会对日期类进行完善&#xff…

在Windows10上安全弹出U盘的三种方法,总有一种适合你

序言 为了避免数据丢失,你有必要学习如何在使用完外部硬盘或U盘后安全地将其从计算机中取出。如果在断开U盘之前不弹出,你可能会面临数据损坏的问题。所以不要懒惰。那么,如何从计算机中弹出外部硬盘驱动器或U盘?看看这里。这篇文…

强化训练:day5(游游的you、腐烂的苹果、孩子们的游戏(圆圈中最后剩下的数)

文章目录 前言1. 游游的you1.1 题目描述1.2 解题思路1.3 代码实现 2. 腐烂的苹果2.1 题目描述2.2 解题思路2.3 代码实现 3. 孩子们的游戏(圆圈中最后剩下的数)3.1 题目描述3.2 解题思路3.3 代码实现 总结 前言 本章内容:游游的you、腐烂的苹果、孩子们的游戏(圆圈中…

【03】JAVASE-分支语句【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture:波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。…

Redis 服务等过期策略和内存淘汰策略解析

redis服务是基于内存运行的,所以很多数据都存放在内存中,但是内存又不是无限的,所以redis就引出了key的过期和淘汰策略。 一、Redis的过期策略: 我们在set key的时候,可以给它设置一个过期时间,比如expire …

Autosar MCAL-RH850P1HC Fls配置

文章目录 FlsFlsGeneralFlsAcLoadOnJobStartFlsBaseAddressFlsBlankCheckApiFlsCancelApiFlsCompareApiFlsCopySupportedFlsCriticalSectionProtectionFlsDevErrorDetectFlsDeviceNameFlsDriverIndexFlsFaciEccCheckFlsGetJobResultApiFlsGetStatusApiFlsLoopCountFlsReadImmed…

(待更)DRF: 序列化器、View、APIView、GenericAPIView、Mixin、ViewSet、ModelViewSet的源码解析

前言:还没有整理,后续有时间再整理,目前只是个人思路,文章较乱。 注意路径匹配的“/” 我们的url里面加了“/”,但是用apifox等非浏览器的工具发起请求时没有加“/”,而且还不是get请求,那么这…

大语言模型在研究领域的应用——信息检索中的大语言模型

信息检索中的大语言模型 大语言模型提升信息检索任务利用大语言模型进行信息检索大语言模型增强的信息检索模型. 检索增强的大语言模型输入优化策略.指令微调策略.预训练策略. 总结应用建议未来方向 大语言模型对于传统信息检索技术与应用范式带来了重要影响。这两者在技术路径…

【加密周报】中美下周有“大事”发生!准备联手引爆比特币大行情?美国大型养老基金和梅隆银行已持有比特币ETF!

自减半之后,比特币便进入了横盘状态,始终在6-6.5万美元价格区间震荡。4月24日,香港证监会官网正式公示虚拟资产现货ETF获批名单,华夏(香港)、嘉实国际、博时国际旗下相关产品均在其列,并计划将于…

K8s 使用 Ceph RBD 作为后端存储(静态供给、动态供给)

一、K8s 使用 Ceph RBD Ceph RBD(Rados Block Device)是 Ceph 存储集群中的一个重要组件,它提供了块级别的存储访问。RBD 允许用户创建虚拟块设备,并将其映射到客户端系统中,就像本地磁盘一样使用。 首先所有 k8s 节…

【算法学习】线段树基础版

一 线段树 1.概念 线段树可以理解为一个二叉树,如果是利用线段树求区间的和,那么每个结点的权值维护的是结点所维护区间的和,再将该区间一分为二,分别交由左右儿子维护。 拿区间1 - 4的和来举例子, 根结点维护的是区…

嵌入式Linux学习——Ubantu初体验

Ubuntu 和Windows 的最大差别 Windows中的每一个分区都对应着一个盘符,盘符下可以存放目录与文件,而在Ubantu中没有盘符的概念,只有目录结构。实际上不同的目录可能挂载在不同的分区之下,如果想要查看当前目录位于磁盘的哪个分区…