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

前言

环境:

  • 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相关的函数操作,后续会说明。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

table表格导出为excel文件并设置样式

table表格导出为excel文件并设置样式 安装xlsx、xlsx-style-medalsoft 的 npm 包: npm i xlsx xlsx-style-medalsoft设置全局: Vue.prototype.$XLSX XLSX; // 设置全局 Vue.prototype.$XLSXStyle XLSXStyle; // 设置全局具体代码实现: …

WordPress缓存插件有哪些?好用的缓存插件分享

目前WordPress缓存插件有:WP Rocket、WP Super Cache、W3 Total Cache、Sucuri、NitroPack、SiteGround Optimizer、LiteSpeed Cache、WP-Optimize、Hummingbird、Cache Enabler、Comet Cache。 在当今的数字世界中,拥有一个高效的网站对于吸引和留住用…

tomcat 配置支持 ssl 附效果图

1、修改tomcat配置文件server.xml: vim ./conf/server.xml 把配置文件&#xff1a; <Connector port"8088" Server" " protocol"HTTP/1.1"connectionTimeout"20000"redirectPort"8443" URIEncoding"UTF-8" …

维基百科、百度百科和搜狗百科词条的创建流程

随着网络的发展&#xff0c;百度百科、搜狗百科、维基百科等百科网站已经成为大众获取知识的重要途径。因为百科具有得天独厚的平台优势&#xff0c;百科上的信息可信度高&#xff0c;权威性强。所以百科平台也成为商家的必争之地。这里小马识途聊聊如何创建百度百科、搜狗百科…

Linux RTC驱动深入解析

目录标题 实时时钟&#xff08;RTC&#xff09;基础Linux内核中的RTC框架RTC设备类设备树&#xff08;Device Tree&#xff09; 编写Linux RTC驱动1. 初始化和注册2. RTC设备操作函数3. 清理函数 测试RTC驱动驱动开发的挑战总结 在许多嵌入式系统和服务器上&#xff0c;实时时钟…

NodeJs如何使用SQL模糊查询

最近在改一个比较久的项目&#xff0c;是使用nodejs写的&#xff0c;但是对于长期写java的后端开发来说&#xff0c;还是有点难维护&#xff0c;不过不改bug的话&#xff0c;就需要重新开发&#xff0c;所以只能慢慢看nodejs代码&#xff0c;测试人员提了一个需要支持模糊查询的…

Linux I2C(三) i2c bus/adapter/client_device注册

一&#xff0c;i2c总线注册 1&#xff0c;i2c_bus_type i2c_bus_type注册流程&#xff1a; //kernel\drivers\i2c\i2c-core-base.c postcore_initcall(i2c_init);retval bus_register(&i2c_bus_type); 注册之后生成i2c bus目录&#xff1a; /sys/bus/i2c # ls -l drw…

js 操作数组的方法

在 JavaScript 中&#xff0c;数组对象提供了多种方法来操作数组。以下是一些常用的数组操作方法&#xff0c;包括它们的详细代码示例&#xff1a; 1、push() - 向数组的末尾添加一个或多个元素&#xff0c;并返回新的长度。 let array [1, 2, 3]; array.push(4); // 添加单…

基于 Grassmannian Manifold的动态图嵌入学习的脑网络时空枢纽识别

Spatiotemporal Hub Identification in Brain Network by Learning Dynamic Graph Embedding on Grassmannian Manifold 摘要 神经成像技术的进步使得测量不同大脑区域之间的连接随时间演变成为可能。新出现的证据表明&#xff0c;一些关键的大脑区域&#xff0c;称为枢纽节点…

机器学习(四)之无监督学习

前言&#xff1a; 前面写了监督学习的几种算法&#xff0c;下面就开始无监督啦&#xff01; 如果文章有错误之处&#xff0c;小伙伴尽情在评论区指出来&#xff08;嘿嘿&#xff09;&#xff0c;看到就会回复的。 1.聚类&#xff08;Clustering&#xff09; 1.1 概述&#xff…

[Android]Jetpack Compose加载图标和图片

一、加载本地矢量图标 在 Android 开发中使用本地矢量图标是一种常见的做法&#xff0c;因为矢量图标&#xff08;通常保存为 SVG 或 Android 的 XML vector format&#xff09;具有可缩放性和较小的文件大小。 在 Jetpack Compose 中加载本地矢量图标可以使用内置的支持&…

FreeRTOS学习 -- 任务

一、什么是任务系统 单片机裸跑的时候一般都是在main函数里面用 while (1) 做一个大循环来完成所有的处理&#xff0c;即应用程序是一个无限的循环&#xff0c;循环中调用相应的函数完成所需的处理。这个就是单任务系统&#xff0c;也称为前后台系统&#xff0c;中断服务函数作…

Python的一些中级用法

Python的中级用法涵盖了更复杂的编程技巧和概念&#xff0c;包括函数式编程、面向对象编程、模块化设计、文件操作、异常处理等。下面是Python的一些中级用法&#xff1a; 1.列表推导式 使用简洁的语法创建列表。 # 生成一个包含1到10的平方的列表 squares [x**2 for x in …

MongoDB学习【一】MongoDB简介和部署

MongoDB简介 MongoDB是一种开源的、面向文档的、分布式的NoSQL数据库系统&#xff0c;由C语言编写而成。它的设计目标是为了适应现代Web应用和大数据处理场景的需求&#xff0c;提供高可用性、横向扩展能力和灵活的数据模型。 主要特点&#xff1a; 文档模型&#xff1a; Mon…

小米一面:说说MVC与设计模式的关系

前言 大家好&#xff0c;我叫阿杆&#xff0c;不叫阿轩。 先来看看面试环节吧。 面试官&#xff1a;请说说MVC模式是基于哪种设计模式的&#xff1f; 求职者&#xff1a;MVC本身不就是一种设计模式吗&#xff1f; 面试官&#xff1a;我的意思是&#xff0c;MVC是基于23中设计…

SpringMVC中的文件上传和中英文名称文件下载

一、文件上传 前端&#xff1a; <% page language"java" contentType"text/html;charsetUTF-8"pageEncoding"UTF-8"%> <! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4…

如何使用 Fly.io 和 Tigris 部署 Next.js 应用

在本教程中&#xff0c;您将学习到应用部署平台 Fly.io 和全球分布式的 S3 兼容对象存储服务 Tigris。 这两个平台密切相关&#xff0c;使它们成为您项目的绝佳选择。您可以从 Fly.io 获得应用部署体验&#xff0c;并从 Tigris 获得对象存储功能。 应用部署相当简单易懂&…

ECC(椭圆曲线密码学)和DH(迪菲-赫尔曼密钥交换)

目录 ECC(椭圆曲线密码学)和DH(迪菲-赫尔曼密钥交换) ECDHE和ECC在密码学领域

前端的一些3D旋转效果和实例——table切换

首先&#xff0c;讲一下有关3D旋转的属性&#xff1a; transform用于设置变形,有以下参数 1、translate(x,y) 2D的设置移动距离&#xff0c;x表示沿x轴的距离&#xff0c;y表示沿y轴的距离&#xff08;y轴是向下为正&#xff09;不写代表0 translateX(x) translateY(y) tr…

题解:力扣704/35/34

1.力扣704 : 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。示例 1:输入: nums [-1,0,3,5,9,12], target 9 …