MySQL——数据类型
一、常见的数据类型及分类

其中上述的数值类型包含了整形和浮点型,文本、二进制类型主要是字符串类型。
- 整数类型(Integer Types):
- TINYINT:范围为-128到127或0到255(无符号),用于存储较小的整数值,如存储性别或状态信息。
- SMALLINT:范围为-32768到32767或0到65535(无符号),用于存储较小的整数值,如存储年龄或计数值。
- MEDIUMINT:范围为-8388608到8388607或0到16777215(无符号),适用于中等大小的整数数值存储。
- INT:范围为-2147483648到2147483647或0到4294967295(无符号),适用于一般整数值存储。
- BIGINT:用于存储大整数值,如存储ID或计数值。
- 浮点数类型(Floating-Point Types):
- FLOAT:用于存储单精度浮点数,约占用4个字节的空间。
- DOUBLE:用于存储双精度浮点数,约占用8个字节的空间。
- DECIMAL:用于精确的十进制数值存储,适用于货币或其他需要精确计算的场景。
- 日期与时间类型(Date and Time Types):
- DATE:用于存储日期,格式为’YYYY-MM-DD’,如’2000-01-01’。
- TIME:用于存储时间,格式为’HH:MM:SS’,如‘18:30:00’。
- DATETIME:用于存储日期和时间,格式为’YYYY-MM-DDHH:MM:SS’,如’2000-01-0118:30:00’。
- 字符串类型(String Types):
- CHAR:用于存储固定长度的字符串,如CHAR(10)可以存储长度为10的字符串。
- VARCHAR:用于存储可变长度的字符串,如VARCHAR(255)可以存储长度为最大255的字符串。
- TEXT:用于存储较长的文本数据,例如文章内容或备注信息。
- 枚举和集合类型:
- 枚举(ENUM)类型:枚举类型允许你从一组预定义的选项中选择一个单独的值。在创建表结构时,你可以指定枚举类型的字段允许的值列表。
- 集合(SET)类型:集合类型允许你从一组预定义的选项中选择多个值,这些值之间用逗号分隔。与枚举类型不同,集合类型允许选择多个选项,而不仅限于一项。
- 其他类型:
- BOOLEAN:在MySQL中没有专门的BOLLEAN类型,通常使用TINTINT(1)来表示bool值,0表示false,1表示true。
二、数值类型
2.1 整型
整型包括以下几种:

它们最根本的区别就是所占用的空间大小不同,也因此导致了能够存储的数据范围不同。
2.1.1 tinyint
先来测试一下tinyint的取值范围。

我们尝试插入一些数据。

在插入合法的范围内是能够正常进行插入的,但是一旦超过tinyint的取值范围,就会不让插入了,而且当插入的数据不是整型时,也是不让插入。
在C/C++中,int tmp = 'a’最多会发出提醒,并不会报错,本质上发生了隐式类型转换。char a = 200也不会报错,会发生截断。即使你存储的数据超出了指定类型的取值范围,也并不会报错,而是发出警告并且存储溢出后进行调整的值。
在数据库中并不想C/C++那样,而是有着严格的要求。**mysql的数据类型中,符合条件才会让你操作,不符合条件直接不让操作。**在mysql的数据类型中,除了能够满足各种应用场景,还有一个特别重要的用途:数据类型本质就是一种约束!约束就是强制必须按照规则去做,约束的就是使用者,倒逼使用者,必须遵守规则!
我们再来简单测试一下无符号的tinyint。

我们尝试向tmp1列中插入一些数据,如下图:

我们在查看表t1的数据时,发现有NULL。那么NULL和空字符串’ ‘是一样的吗?答案是不一样的。NULL和空字符串’ '代表这不同的含义:
- NULL:在数据库中表示缺少值或未知值。当一个字段的值未知或者不适用时,可以使用NULL来表示。NULL不等于任何其他值,包括空字符串。
- 空字符串’ ':表示一个空的字符串值。当一个字段需要有值,但是没有具体数值或字符时,可以使用空字符串来表示。空字符串是一个有效的值。
在mysql中,字符串可用单引号’ ‘来引用,也可以使用双引号" "来引用。一般情况下在mysql中都是用单引号’ '的。
2.1.2 bit
bit类型也是一种数据类型。bit类型是用于存储二进制数字的数据类型。它可以用来表示位值为0或1的数值,比如开关状态、标志位等。

如上图,我们创建了一个t2表。其中包含了列a,数据类型为int;列b,数据类型为bit(10)。括号内的10的意思就是我们指定有几个比特位。那么b的大小是10个比特位。我们再来测试一下,如下图:

确实能欧插入成功。10个bit能够存储的数据范围是0~1023。确实正如上图所示。我们再来查看一下表中的数据。如下图:

怎么表中存储的并不是我们所插入的数据呢?存储是按照我们所插入的数据进行存储的,但是bit类型在显示时,是按照ASCII码对应的值进行显示的。具体如下图:

需要注意的是,虽然bit类型可以用于存储任意大小的二进制数,但是在实际应用中,bit通常只是用于存储较小的数值。这是因为bit类型的空间效率相对较低,对于较大的数值,使用其他数据类型可能会更加合适。
2.2 浮点型
2.2.1 float
float用于存储近似值的浮点数,它表示单精度浮点数。由于浮点数是以二进制形式表示的,可能存在精度丢失的情况。下面我们通过具体实例来理解用法。

上图中我们创建了一个名字为t3的表。其中包含了一个字段a,其类型为float(4,2)。**float的语法格式为float(M,D),其中M表示总位数,D表示小数点后的位数。例如,float(4,2)表示总共4位,其中2位为小数位。**下面我们插入一些数据来看一下,如下图:

那如果是插入长度大于4的数据呢?我们再来看下图:

正如上图所示,当小数位数大于两位时,会进行四舍五入。四舍五入就会产生进位,但必须保证进位后的小数也能够满足两位,也就是整数部分不得超过两位。这里可以看到float(4,2)的取值范围是-99.994 ~ 99.994。
下面再来看一下无符号的float,如下图:

插入数据:

但是负数就不能再进行插入了,如下图:

其实在这里就可以发现,float(M,D)中的M和D限制了我们的数据范围,其次就是有符号和无符号的区别。float可以表示最大值为3.402823e+38的正或负实数,所占用的字节为4字节。
在MySQL中,如果不指定float类型的总位数和小数点后的位数,默认情况下float类型的总位数是其最大取值范围。

这里可以看到,float一旦数据较大,就会有精度损失。一般情况下提供6位精度。
这意味着float类型可以存储大约6位有效数字的数据,但实际精度可能受到存储数据时的舍入误差的影响。
2.2.2 decimal
decimal用于精确存储数字,它表示定点数,能够保证精度不会丢失。
decimal的语法格式为DECIMAL(M,D),其中M表示总位数,D表示小数点后的位数,例如,DECIMAL(10,2)表示总共10位,其中2位为小数位。

这里可以看到,decimal类型精度并没有丢失。decimal与float都是用来存储浮点数的,用法也是相同的,不同的是,decimal类型存储的数字是精确的,不会丢失精度。decimal占用的空间为8字节。
三、字符串类型
3.1 char
char类型在mysql中是一个经常使用的类型。

这里定义了一个名字为str的字段,其属性为char(5),也就是最多可存储5个字符。插入数据来看一下:

这里可以看到,一旦插入的字符长度超过5,就不会让你插入了。**【注意】在mysql中,char(5)中的5指的是5个字符,并不是5个字节。**所以在这里最多也可以插入5个汉字。

在不同编码中,一个字符所占的字节个数是不同的。比如utf8中一个字符占3个字节,而gbk中一个字符占2个字节。char(5)就是指能够最多插入5个字符。这样用户在使用时就不用关心字节数的问题了。
char也是有字符长度上限的,char的字符长度上限是255。

3.2 varchar
varchar也是用来存储字符的数据类型。使用方法和char相同。

那么 varchar 和 char 有什么区别呢?就char(10) 和 varchar(10) 来说明,无论char中实际存储的字符串长度是多少,char始终占用10个字符长度的存储空间。但是varchar是一种可变长度的字符类型,意味着它只占用实际存储数据所需的存储空间。我们在varchar中只存储5个字符的话,那么varchar只占用5个字符长度的空间。
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
- varchar长度可以指定为0~65535之间的值,但是有1-3个字节用于记录数据大小(varchar是变长的),所以说有效字节数是65532。
- 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(因为utf中,一个字符占用3个字节);如果编码是gbk,varchar(n)的参数n最大值是65532/2=32766(因为gbk中,一个字符占用2个字节)。
3.3 char和varchar的比较
- CHAR数据类型:
- CHAR是一种固定长度的字符类型,意味着它始终占用固定数量的存储空间。
- 当定义一个CHAR列时,您需要指定该列的固定长度。例如,CHAR(10)表示该列将始终存储10个字符。
- 无论实际存储的字符串长度是多少,CHAR始终占用指定长度的存储空间。
- CHAR适合存储长度固定的字符串,例如邮政编码或固定长度的标识符。
- VARCHAR数据类型:
- VARCHAR是一种可变长度的字符类型,意味着它只占用实际存储数据所需的存储空间。
- 当定义一个VARCHAR列时,您需要指定该列可存储的最大长度。例如,VARCHAR(100)表示该列可以存储最多100个字符,但实际存储的字符串长度可以少于100个字符。
- VARCHAR适合存储长度可变的字符串,例如用户输入的文本或变长的描述信息。
【主要区别】
- 存储方式:CHAR是固定长度的,而VARCHAR是可变长度的。这意味着在使用CHAR时,数据将按固定长度存储;而使用VARCHAR时,额外的空间将被用来存储数据长度信息。
- 性能:CHAR由于固定长度和提前分配的空间,其性能通常比VARCHAR要快。特别是当已知要存储的字符串长度时。而VARCHAR因为其灵活性(读取时需要先读取存储字符串的长度,再访问指定长度的空间),可能稍慢一些。
- 空间使用:CHAR使用固定的空间来存储数据,因此可能会因为并没有使用全部空间而造成空间的浪费。但VARCHAR使用额外空间来存储数据长度信息,相对来说空间利用率较高。
- 可变字段:如果一个字段的数据长度可能会有所不同,使用VARCHAR可能会更好,因为它允许更大的数据长度。
选择使用哪种类型取决于具体需求。如果知道要存储的字符串的长度,并且长度是固定的,CHAR可能是一个好选择。然而,如果不确定字符串的长度,或者需要更大的灵活性,使用VARCHAR可能更合适。
四、日期与时间类型
在前面的文章使用过到data类型。该类型就是属于日期类型的。常见的日期类型有:
- date:日期格式为 ‘YYYY-MM-DD’,占用三字节。
- datetime:时间日期格式为 ‘YYYY-MM-DD HH:MM:SS’,占用八字节。
- timestamp:时间戳,从1970年开始的。格式为 ‘YYYY-MM-DD HH:MM:SS’,占用四字节。

通过上图可以看出,timestamp时间戳是不允许为空的,并且他是有默认值的。默认值就是当前的时间戳。插入数据看一下:

看到并没有插入时间戳时会自动插入和更新的。这里的更新是指的每当对表进行修改操作时,时间戳就会更新。
在使用这些数据类型时,需要根据实际需求选择合适的类型。如果只需要存储日期,选择DATE类型;如果需要存储日期和时间,选择DATETIME或TIMESTAMP类型,根据需要考虑是否需要自动更新功能。TIMESTAMP常用于的就是评论时记录时间或者发表内容时的时间。
五、枚举与集合类型
5.1 enum
enum类型是一种字符串对象的类型,用于定义一个列可以包含的可能值的有限列表。语法:enum(‘value1’, ‘value2’, …)。其中,‘value1’, 'value2’等是列允许的枚举值。我们直接看一个实际的例子。如下图:

当我们再插入数据时,插入hobby属性时,就可以从我们的枚举列表中进行选择其中一个进行插入。如下图:

如上图所示,插入的数据并不是枚举中的属性值,就会报错。出于效率考虑,这些值实际存储的是“数字”,因此这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号(枚举中仍然何以使用下标进行选择所要插入的数据)。如下图:

但是需要注意的一点是:枚举中的第一个元素下标是从1开始的,并不是从0开始的。
5.2 set
通过对上述的枚举的理解后,我们发现在很多情况下一个人的爱好会有很多,并不是只有一个。但是枚举类型只能一次选一个。这时候我们就可以使用set类型。
SET是一种字符串对象,用于定义一个列可以包含的可能值的多选列表。语法:SET(‘value1’, ‘value2’, …)。其中,‘value1’, 'value2’等是列允许的多选值。我们可以直接通过之前学的对表进行修改,把hobby的类型改成set。具体如下图

插入一些数据,具体如下图:

通过上图可以看到,再插入数据时我们可以从set集合中一次选多个数据进行插入,也可一次只选一个数据。set集合设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;**而且出于效率考虑,这些值实际存储的也是“****数字”,因此这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,…最多64个。我们再来通过数字进行插入,**具体如下图:

【注意】3是1和2相加的结果,7是1和2和4相加的结果。我们可对应set集合进行查看。
虽然可以用数字添加枚举,但是不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读,且后期维护成本较高。
5.3 查找
find_in_set()是 MySQL 中的一个函数,用于在逗号分隔的字符串列表中查找指定的字符串。它的作用是在一个逗号分隔的字符串列表中查找指定的值,并返回该值在列表中的位置。使用方法:
FIND_IN_SET(search_string, string_list)
其中:
- search_string是要查找的字符串。
- string_list是逗号分隔的字符串列表,它包含要搜索的多个字符串。
返回值:
- 如果search_string在string_list中找到,则返回它在列表中的位置(从 1 开始)。
- 如果未找到,则返回 0。

我们就使用find_in_set()进行查找喜欢篮球的,结果如下图:

当然,也可以在后面跟任何你想筛选的条件。
相关文章:
MySQL——数据类型
一、常见的数据类型及分类 其中上述的数值类型包含了整形和浮点型,文本、二进制类型主要是字符串类型。 整数类型(Integer Types): TINYINT:范围为-128到127或0到255(无符号),用于…...
《AI赋能自由职业:开启竞争力提升新征程》
在当今数字化时代,AI技术为自由职业者带来了前所未有的机遇,使其能够在激烈的市场竞争中脱颖而出。以下是自由职业者借助AI提升自身竞争力的几种方法。 利用AI优化工作流程,提高效率 自动化任务处理:自由职业者可以借助自动化工具…...
Excel转Json编辑器工具
功能说明:根据 .xlsx 文件生成对应的 JSON 文件,并自动创建脚本 注意事项 Excel 读取依赖 本功能依赖 EPPlus 库,只能读取 .xlsx 文件。请确保将该脚本放置在 Assets 目录下的 Editor 文件夹中。同时,在 Editor 下再创建一个 Exc…...
创建型设计模式、结构型设计模式与行为型设计模式 上下文任务通用方案 设计模式 大全
设计模式(Design Pattern)是一种面向对象编程的思想,分为创建型模式、结构型模式与行为型模式三大类,它们提供了在特定上下文中解决常见任务的通用方案,旨在让程序(软件)具有更好的特点…...
Mac 环境 VVenC 编译与编码命令行工具使用教程
VVenC VVenC 是一个开源的高效视频编码器,专门用于支持 H.266/VVC (Versatile Video Coding) 标准的编码。H.266/VVC 是继 HEVC (H.265) 之后的新一代视频编码标准,主要目的是提供比 HEVC 更高的压缩效率,同时保持或提高视频质量。H.266/VVC…...
如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程
简介 本教程将教你如何优化 Nginx,使其能够高效地处理高流量网站。 Nginx 是一个强大且高性能的 Web 服务器,以其高效处理大量并发连接的能力而闻名,这使得它成为高流量网站的流行选择。 正确优化 Nginx 可以显著提高服务器的性能࿰…...
springcloud各个组件介绍
Spring Cloud 是一系列框架的集合,它基于 Spring Boot 提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话和集群状态)中快速构建一些常见模式的工具。下面是对 Sprin…...
HTML5实现好看的喜庆圣诞节网站源码
HTML5实现好看的喜庆圣诞节网站源码 前言一、设计来源1.1 主界面1.2 圣诞介绍界面1.3 圣诞象征界面1.4 圣诞活动界面1.5 圣诞热度界面1.6 圣诞纪念界面1.7 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的喜庆圣诞节网站源码,圣…...
《学习之道》
《学习之道》主要讲述了以下内容: 学习的原理 大脑的两种认知模式:介绍了专注模式和发散模式。专注模式适合集中精力解决具体问题、进行深度理解和记忆推理,但长时间使用易疲惫和陷入思维定式;发散模式则让大脑在更广泛的认知网…...
【Unity3D】ECS入门学习(十一)ComponentSystem、JobComponentSystem
ComponentSystem:仅支持主线程执行,不支持多线程,并且无法使用SystemBase介绍的扩展方法。 using Unity.Entities; using Unity.Transforms; using Unity.Mathematics;/// <summary> /// 仅主线程执行,不支持多线程 /// &l…...
力扣刷题:栈和队列OJ篇(上)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 目录 1.用队列实现栈(1)题目…...
XGPT用户帮助手册
文章目录 2024 更新日志2024.12.272024.12.29 摘要 本文详细介绍了XGPT软件的功能及发展历程。XGPT是一款融合了当前最先进人工智能技术的多模态智能软件,专为国内用户优化设计。除了强大的智能问答功能外,XGPT还结合日常办公和科学研究的需求࿰…...
Oracle 数据库 dmp文件从高版本导入低版本的问题处理
当前有个需求是将oracle 19c上的数据备份恢复到oracle 11g上使用。我们通过exp命令远程进行备份,然后通过imp进行恢复时出现IMP-00010: not a valid export file, header failed verification报错。 这是数据库版本问题,在使用exp命令导出的时候使用的客…...
ShardingSphere-Proxy分表场景测试案例
快速入门文章参考:《ShardingSphereProxy:快速入门》 基于K8S部署文章参考:《基于K8s部署ShardingSphere-Proxy》 基于golang的测试用例参考:《ShardingSphere-Proxy 连接实战:从 Golang 原生 SQL 到 GORM 的应用》 背景 我们…...
学技术学英文:Tomcat的线程模型调优
导读: tomcat 线程调优关键需要理解下面这几个参数: 1. maxConnections 描述:指定服务器能够同时接受和处理的最大连接数。也就是说,服务器在任何时候都能处理的最大并发连接数。作用:限制服务器在任何给定时间点能…...
创建flutter项目遇到无法连接源的问题
Flutter 环境信息 Flutter版本: 3.19.4 (channel stable) Framework: revision 68bfaea224 (2024-03-20) Engine: revision a5c24f538d Dart: 3.3.2 DevTools: 2.31.1 项目基本信息 项目路径: D:\F\luichun 域名: www.luichun.com.cn 支持平台: android, web, windows 项目创…...
MAC系统QT图标踩坑记录
MAC系统QT图标踩坑记录 1. 准备图标1.1 方法一:下载准备好的图标1.2 方法二:自己生成图标1.2.1 准备一个png文件1.2.2 用sips生成不同大小的图片1.2.3 用iconutil生成图标文件 2. 配置图标2.1. 把图标改命成自己想要的名字,如icon.icns&#…...
TF-IDF(Term Frequency-Inverse Document Frequency)详解:原理和python实现(中英双语)
中文版 TF-IDF算法详解:理解与应用 TF-IDF(Term Frequency-Inverse Document Frequency)是信息检索与文本挖掘中常用的算法,广泛应用于搜索引擎、推荐系统以及各种文本分析领域。TF-IDF的核心思想是通过计算一个词在文档中的重要…...
【竞技宝】CS2:HLTV2024职业选手排名TOP15-xantares
北京时间2024年12月30日,HLTV年度选手排名正在持续公布中,今日凌晨正式公布了今年的TOP15选手为EternalFire战队的xantares选手。 选手简介 xantares是一名来自于土耳其的CS职业选手,出生于1995年,今年已经29岁。早在2012年&…...
Spring-kafka快速Demo示例
使用Spring-Kafka快速发送/接受Kafka消息示例代码,项目结构是最基础的SpringBoot结构,提前安装好Kafka,确保Kafka已经正确启动 pom.xml,根据个人情况更换springboot、java版本等 <?xml version"1.0" encoding&qu…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
