【MYSQL】-数据类型

在这里插入图片描述
💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者gitee:gitee✨
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

文章目录

  • 前言
  • 一、数据类型的分类
  • 二、 数值类型
    • 2.1 整型
    • 2.2bit类型
    • 2.3小数类型
      • 2.3.1float
      • 2.3.2decimal
  • 三、文本、二进制类型
    • 3.1 char
    • 3.2varchar
    • 3.3char和varchar的区别
  • 四、日期和时间类型
  • 五、String类型
    • 5.1enum
    • 5.2set
  • 六、总结


前言

今天我们开始讲解数据类型,相比较语言,我们的sql中的数据类型和语言的数据类型有相近之处,但是也有不同之处,所以博主会通过很多例子给大家看看这些数据类型和语言的差异,而且数据类型就代表我们存储数据的类型,所以说数据类型还是非常重要的,也希望读者要理解这些数据类型,才能更好的操作我们的数据库,话不多说,我们开始进入正文。


一、数据类型的分类

在这里插入图片描述
标红的博主一会都会介绍的,大家先看看类型对应的说明,有了语言数据类型的基础,大家应该不难理解sql的数据类型。

二、 数值类型

2.1 整型

在这里插入图片描述

我们以tinyint为例,其他的都是相同的用法

在这里插入图片描述

我们使用desc查看到我们的num对应的数据类型是tinyint(4),这里面的数据先不用管,后面有机会在说,我们往里面插入一些数据,来测试一样数值越界的实验:
在这里插入图片描述
通过实验我们发现一旦数据不符合类型规定的范围,就插入失败。


  1. 如果我们向mysql特定的类型中插入不合法数据,mysql一般都是直接拦截我们,不让我们做对应的操作
  2. 反过来,如果我们已经有数据被成功插入到MySQL中,一定插入的时候是合法的。

所以mysql中,一般而言,数据类型本身也是一种约束(后面有单独介绍约束的话题) ,约束本身是倒逼程序员正确的操作数据库,进行正确的插入,所以约束,本质是约束使用者,另外,如果你不是一个很好的使用者,mysql也能保证数据插入的合法性,同样的,我们讷讷感保证数据库中的数据是可预期的完整的

通过我们上面的例子我们知道了数据类型的作用,所以这也让大家可以更加认真的去学习数据类型,上面的说明:
· 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
· 可以通过UNSIGNED来说明某个字段是无符号的


我们不写unsigned默认就是无符号的,我们来看看加上什么效果:
在这里插入图片描述

通过上面的例子我们看到tinyint有符合的取值范围是-128-127,无符合的取值范围是0-255,这个大家应该知道怎么回事,其余的关于整型的其他数据类型和这个都是一样的使用,只是存储的数据范围不一样而已。

注意:为什么要设计这么对存相同类型的数据类型?
上面我们存储整型有五个,每一种都有自己的使用场景,因为数据库他是需要存放海量数据的,所以给每个数据的时候空间就要合理起来,次啊能更好的节省空间,例如,年纪使用tinyint就是存储,你非得使用bigint,确实可以存储,但是这样就导致每一条数据又很多字节浪费了,所以我们要看存储的数据来确定使用那种数据类型最好,后面介绍的每一类数据类型可能都不止一种,原因就是这个,给更复杂的数据提供合适的使用场景。

2.2bit类型

bit[(M)] : 位字段类型。M表示每个值的位数,范围从164。如果M被忽略,默认为1

在这里插入图片描述

  1. 我们看到我们在定义字段的时候,使用bit(8)这个数据类型,就表示他有八个比特位可以用,通过插入的数据,我们看到插入到255就插入不了,而且我们发现负数插入不了,说明这个数据类型只能插入非负的数据,也不存在什么有符号无符号之说。
  2. 我们看到插入数据居然没有显示,插入255就有显示,原因是使用bit这个数据类型他是按照ASCII码对应的值显示的,而前几个插入的数据是我们看不到的效果,我们按照十进制的方式查询select id hex(a) from t3
    在这里插入图片描述
    这样就可以看出来确实是有数据插入进去的。
  3. 通过输入我们熟悉的字符来看结果
    在这里插入图片描述
    也符合我们的验证.

我们直接定义bit里面不带数字,默认就是一位,来看效果:
在这里插入图片描述

我们看到这样只能存储进去0,1这两个数,但我们只有两种状态的场景,使用这个数据类型就非常的合适 ,节省空间。
我们超过它规定的64位连表都会创建失败:
在这里插入图片描述

2.3小数类型

2.3.1float

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
来看案例:

在这里插入图片描述

我们看到我们的数据在超过位数的时候,会进行四舍五入,如果四舍五入之后的数超过范围了就也插入不成功,我们发现在显示中小数部分都是两位,但是所有位数最终不超过4位。


如果float(6,3),范围是-999.999-999.999


上面的是有符合的,我们的小数类型还有无符号,和整型一样,加unsigned。

在这里插入图片描述

我们看到小数的无符合是直接将负数那部分砍掉。范围是0-99.99。


我们直接定义不带括号里面的数字,那么我们的float可以存储更大的数。
在这里插入图片描述
我们发现我们的float在保存大点的数据的时候,就会出现精度丢失,所以我们引入下面的一个数据类型decimal

2.3.2decimal

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

decimal(5,2) 表示的范围是 -999.99 ~ 999.99
decimal(5,2) unsigned 表示的范围 0 ~ 999.99
decimal和float很像,但是有区别:
float和decimal表示的精度不一样

在这里插入图片描述

发现decimal的精度更准确,因此如果我们希望某个数据表示高精度,选择decimal


decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10,这个大家下去测试一样
建议:如果希望小数的精度高,推荐使用decimal。如银行

总结
小数还有一个是double用法都是一样的,无非是精度的差别,可以看最前面的一张图有范围说明

三、文本、二进制类型

3.1 char

**语法:**这个L设置多大,不管里面存的字符是不是少于Lmysql都给你分配L长度大小的空间给你存储数据

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

案例:
在这里插入图片描述

通过结果我们看到,abc超过了设置,所以报错,在我们语言的数据类型,知道一个字符占一个字节,一个汉字占两个或者三个字节,我们在sql中,设置的char(2),应该是2个字节的带下,我设置一个汉字插入没问题,可以理解,但是为什么两个汉字也可以插入进去呢??原因是我们sql中的字符和语言的不一样,一个汉字也是占一个字符,不看你大小。所以上面设置的char(2)最多可以放两个字符,不是必须放两个字符,但也不要超过两个字符,我们的char最多可以设置255个字符,超过了表都创建不成功。
在这里插入图片描述

3.2varchar

语法:这个数据类型是根据你插入数据的大小,系统自动给你分配使用空间,但是插入的数据不要超过L这个长度。

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

大家看到我们的最大长度位65535个字节,所以一会肯定有坑,大家注意,先来看案例:
在这里插入图片描述

我们发现一个汉字也是一个字符,和char的效果是一样的,只不过可以存放的数据大小要比char大一些,我们在来看看varchar还有什么特性,在来看两者的区别。


上面我们测试了char的边界范围,和我们语法描述的是一样的,我们也来测试varchar:
在这里插入图片描述

我们发现都不行,这是为什么??
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占
用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符
占用2字节)。所以我们最大长度的单位是字节,但是括号里面的单位是字符,所以要换算。

那为什么从65532开始计算,不从65535开始呢??
varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,用三个字节的比特位就可以表示当前数据具体是使用了几个字符的空间大小。所以说有效字节数是65532。
为什么需要给出多余字节表示数据的大小??
因为varchar是根据数据类型的大小分配空间,所以读取的时候只有通过记录的大小让sql知道应该读取多大,相当于偏移量。不像char每次固定读取设置的大小
在这里插入图片描述

  1. 博主的字符集是utf8的,我们来看创建t9的时候,大小设置21844居然创建失败,原因是65535也是表中每一行的最大大小,我们创建t9的时候不止一个属性,还有一个id,占4个字节,所以我们需要少设置两个字符,相当于给了六个字节给id去使用,
  2. 我们创建t10的时候,因为就一个name字段,所以一行的所有空间都可以分配给他。
  3. 我们创建t11的时候大小设置程21845也不行,那保存数据大小的位置就没有了,我们设置只是数据的大小,保存数据的sql已经设置好了。这个大家要注意。

3.3char和varchar的区别

在这里插入图片描述
如何选择定长或变长字符串?

  1. 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
  2. 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
  3. 定长的磁盘空间比较浪费,但是效率高。
  4. 变长的磁盘空间比较节省,但是效率低。
  5. 定长的意义是,直接开辟好对应的空间
  6. 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

四、日期和时间类型

常用的日期有如下三个:

date :日期 'yyyy-mm-dd' ,占用三字节
datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 10009999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节

在这里插入图片描述
我们发现我们就插入了t1和t2,但是t3也自动补充进去时间了,我们在来更新一下时间。
在这里插入图片描述
我们只修改了t1我们发现t2没有被修改,t3自动修改了,这就是datatime和timestmap的区别

使用场景:
我们的date一般只需要保存年月日的,比如博物馆购票,不需要规定什么时候来,在指定日期来就行了,其余两个,datetime不希望改变时间的时候,比如电脑开绝技时间,你只要不关机,每次想要查看本次开机时间都是一样的,timestmap一般在评论,你每次修改评论时间都会相对应的发生变化。

五、String类型

5.1enum

语法:
enum:枚举,“单选”类型;
enum(‘选项1’,‘选项2’,‘选项3’,…);

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考
虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535
个;当我们添加枚举值时,也可以添加对应的数字编号。

案例:
在这里插入图片描述

我们看到我们的枚举只能是单选,可以按照内容插入,也可以按照数字插入。不在枚举里面的内容插入不了,也算是一种约束。
说明: 不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。

5.2set

语法:
set:集合,“多选”类型;
set(‘选项值1’,‘选项值2’,‘选项值3’, …);

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,…最多64个。

案例:
在这里插入图片描述

通过结果来看,我们的set是一个集合,是一个多选,但是不在集合里面插入不进去,也可以使用数字插入,但是和enum有差别,不是和位数一一对应,而是和位图对应,数字3不是羽毛球,3对应的是011,所以第一位和第二位为1,所以插入进去的是篮球和足球,这个大家要清楚。


查找数据
对于enum我们不用担心查找,因为是单旋,但是set是多选,我们的筛选语句只能严格匹配,不能找出所有的,我们在往表中插入一些数据:
在这里插入图片描述
查找爱好是羽毛球的人。我们发现查的不全,使用数字也不行,那我们应该怎么办,我们有了下面这个函数,没错,我们的sql中也是有函数:集合查询使用find_ in_ set函数
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;str_list 用逗号分隔的字符串。

使用:
在这里插入图片描述

我们的集合查询函数一次只能查找一个元素在集合中的位置,找不到就返回0.

查询喜欢羽毛球的人并且查询喜欢羽毛球和足球的人:
在这里插入图片描述

相信大家学习到这里,对于enum和set应该学会了,大家下去多去来练习。

六、总结

对于数据类型,博主介绍都是常用的,够大家日常使用了,如果真的有场景这些数据类型适用不了,大家在1去搜一下有没有合适的数据类型,学号数据类型,才是学号数据库操作的第一步,大家一定要度过这一关。我们下一篇讲解表的约束。

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

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

相关文章

分享一个项目——Sambert UI 声音克隆

文章目录 前言一、运行ipynb二、数据标注三、训练四、生成总结 前言 原教程视频 项目链接 运行一个ipynb,就可操作 总共四步 1)运行ipynb 2)数据标注 3)训练 4)生成 一、运行ipynb 等运行完毕后,获得该…

智能优化算法应用:基于饥饿游戏算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于饥饿游戏算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于饥饿游戏算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.饥饿游戏算法4.实验参数设定5.算法结果6.…

深度学习14—注意力机制与自注意力机制

注:以下均为个人学习笔记,发布只为方便学习阅读,若觉侵权,请联系删除!! 1.李沐老师课堂学习理解笔记 1.1 随意线索和不随意线索 1.2 注意力机制 通过注意力池化层来有偏向性的选择某些输入。 1.3 注意力…

vue打包内存问题解决办法<--- Last few GCs ---><--- JS stacktrace --->

**<— Last few GCs —> [18484:0000026763669610] 106760 ms: Mark-sweep 4016.0 <— JS stacktrace —> FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory** 解决办法&#xff1a; set NODE_OPTION…

Leetcode—77.组合【中等】

2023每日刷题&#xff08;六十五&#xff09; Leetcode—77.组合 算法思想 实现代码 class Solution { public:vector<vector<int>> combine(int n, int k) {vector<vector<int>> ans;vector<int> path;function<void(int)> dfs [&…

ansible的脚本-----playbook剧本

ansible的脚本-----playbook剧本 playbook组成部分&#xff1a; 1、tasks任务&#xff1a;包含要在目标主机上执行的操作&#xff0c;使用模块定义这些操作。每个任务都是一个模块的调用 2、variables变量&#xff1a;存储和传递数据&#xff0c;变量可以自定义&#xff0c;…

C++ STL——栈和队列(stack queue)

本节目标 1.stack的介绍和使用及其模拟实现 2.queue的介绍和使用及其模拟实现 3.priority_queue的介绍和使用及其模拟实现 4.容器适配器 1.stack的介绍和使用及其模拟实现 1.1 stack的介绍 stack的文档介绍 根据stack的文档介绍可以知道&#xff0c;stack是一种容器适配器…

docker安装Elasticsearch:8.2和kibana:8.2

前置&#xff1a;es8和7的版本有区别&#xff0c;8的版本比7在安装的时候多了安全校验,本文主要跳过安全校验 主要参考:Docker下elasticsearch8部署、扩容、基本操作实战(含kibana) - 知乎 1.安装es -e xpack.security.enabledfalse主要关闭安全校验 docker pull elasticse…

Springboot优雅实现对接口返回统一封装

前端在调用后端接口时往往不同的接口返回的数据是不一样的&#xff0c;但是通常我们会与前端约定一个固定的返回格式&#xff0c;通过固定的格式告诉他们什么时候接口是返回成功&#xff0c;什么时候返回失败&#xff0c;返回成功后他们如何拿到接口返回的数据去渲染前端页面。…

使用代理服务器和Beautiful Soup爬取亚马逊

概述 Beautiful Soup 是一个用于解析 HTML 和 XML 文档的 Python 库&#xff0c;它能够从网页中提取数据&#xff0c;并提供了一些简单的方法来浏览文档树、搜索特定元素以及修改文档的内容。在本文中&#xff0c;我们将介绍如何使用代理服务器和Beautiful Soup库来爬取亚马逊…

5 分钟内搭建一个免费问答机器人:Milvus + LangChain

搭建一个好用、便宜又准确的问答机器人需要多长时间&#xff1f; 答案是 5 分钟。只需借助开源的 RAG 技术栈、LangChain 以及好用的向量数据库 Milvus。必须要强调的是&#xff0c;该问答机器人的成本很低&#xff0c;因为我们在召回、评估和开发迭代的过程中不需要调用大语言…

【接口测试】HTTP接口详细验证清单

概述 当我们在构建、测试、发布一套新的HTTP API时&#xff0c;包括我在内的大多数人都不知道他们所构建的每一个组件的复杂性和细微差别。 即使你对每一个组件都有深刻的理解&#xff0c;也可能会有太多的信息在你的脑海中出现。 以至于我们不可能一下把所有的信息进行梳理…

python如何更改代码背景图片,背景主题(黑色护眼)和各类文本颜色(python进阶必看,爱了爱了)

一、在 PyCharm 中设置图片背景的方法如下&#xff1a; 打开 PyCharm 的设置窗口&#xff0c;在设置窗口中找到 "Appearance & Behavior" -> "Appearance" 选项卡。在 "Appearance" 选项卡中&#xff0c;找到 "Background Image&qu…

Python学习之复习MySQL-Day8(事务)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;事务简介事务操作模拟转账操作开启事务提交事务回滚事务查看/设置事务提交方法实例演示 事务四大特性并发事务问题分类 事务隔离级别分类查看/设置事务隔离级别实例演示 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语…

Mysql的SQL优化和锁

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

闫式Dp分析法(一种求解动态规划问题的思路)

最近一直跟着Acwing学习动态规划问题的求解思想&#xff0c;感觉晦涩的算法问题一旦经过闫式Dp分析法的剖析&#xff0c;瞬时迎刃而解&#xff0c;故今天我觉得很有必要再次分享一下闫式Dp分析法&#xff08;在此默认你对DP问题有了一定的了解&#xff09;。 闫式Dp分析法 闫式…

前端问题记录

jenkins安装vue依赖报错 jenkins 安装依赖&#xff0c;报错cannot find module ‘/root/.jenkins/workspace/项目路径/node_modules/xxxx’&#xff0c;如图上 解决&#xff1a;执行 npm install vue/cli-service --unsafe-perm&#xff0c;再执行npm i

你以为出现NoClassDefFoundError错误会是什么原因?

你以为出现NoClassDefFoundError错误会是什么原因&#xff1f; 1、概述2、事情经过3、总结 1、概述 大家好&#xff0c;我是欧阳方超&#xff0c;可以关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。 同样的错误&#xff0c;非一样的解决方式。NoClassDefFou…

【sgDragUploadFolder】自定义组件:自定义拖拽文件夹上传组件,支持上传单个或多个文件/文件夹,右下角上传托盘出现(后续更新...)

特性&#xff1a; 支持在拖拽上传单个文件、多个文件、单个文件夹、多个文件夹可自定义headers可自定义过滤上传格式可自定义上传API接口支持显示/隐藏右下角上传队列托盘 sgDragUploadFolder源码 <template><div :class"$options.name" :dragenter"i…

使用Gitee中的CI/CD来完成代码的自动部署与发布(使用内网穿透把本地电脑当作服务器使用)

&#x1f4da;目录 &#x1f4da;简介:⚙️ 所需工具&#xff1a;&#x1f4a8;内网穿透配置&#x1f4ad;工具介绍✨命令安装&#x1f38a;配置Cpolar&#x1f573;️关闭防火墙&#x1f95b;防火墙端口放行规则&#xff08;关闭防火墙可以忽略&#xff09;&#x1f36c;小章总…