[MySQL] MySQL中的数据类型

 

  在MySQL中,数据类型用于定义表中列的数据的类型。在前面的几篇文章中,我们也会看到有很多的数据类型,例如:char、varchar、date、int等等。本篇文章会对常见的数据类型进行详细讲解。希望会对你有所帮助!

文章目录

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

二、数值类型

2、1 整型

2、1、1 tinyint

2、1、2 bit

2、2 浮点型

2、2、1 float

2、2、2 decimal

三、字符串类型

3、1 char

3、2 varchar

3、3 char 和 varchar 比较

四、日期与时间类型

五、枚举与集合类型

5、1 enum

5、2 set

5、3 查找


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:MySQL 👀

💥 标题:MySQL中的数据类型💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️

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

  我们先来看一下MySQL中大体上都会有哪些数据类型。具体如下图:

  其中上述的是值类型包含了整型和浮点型,文本、二进制类型主要是字符串类型。下面我们在具体分类描述一下:

  1. 整数类型(Integer Types)

    • TINYINT:范围为-128到127或0到255(无符号),用于存储较小的整数值,如存储性别或状态信息。
    • SMALLINT:范围为-32768到32767或0到65535(无符号),用于存储较小的整数值,如存储年龄或计数值。
    • MEDIUMINT:范围为-8388608到8388607或0到16777215(无符号),适用于中等大小的整数值存储。
    • INT:范围为-2147483648到2147483647或0到4294967295(无符号),适用于一般整数值存储。
    • BIGINT:范围为-9223372036854775808到9223372036854775807或0到18446744073709551615(无符号),用于存储大整数值,如存储ID或计数值。
  2. 浮点数类型(Floating-Point Types):

    • FLOAT:用于存储单精度浮点数,约占用4个字节的空间。
    • DOUBLE:用于存储双精度浮点数,约占用8个字节的空间。
    • DECIMAL:用于精确的十进制数值存储,适用于货币或其他需要精确计算的场景。
  3. 日期与时间类型(Date and Time Types):

    • DATE:用于存储日期,格式为'YYYY-MM-DD',如'2023-11-13'。
    • TIME:用于存储时间,格式为'HH:MM:SS',如'12:30:00'。
    • DATETIME:用于存储日期和时间,格式为'YYYY-MM-DD HH:MM:SS',如'2023-11-13 12:30:00'。
  4. 字符串类型(String Types):

    • CHAR:用于存储固定长度的字符串,如CHAR(10)可以存储长度为10的字符串。
    • VARCHAR:用于存储可变长度的字符串,如VARCHAR(255)可以存储长度最大为255的字符串。
    • TEXT:用于存储较长的文本数据,例如文章内容或备注信息。
  5. 枚举和集合类型

    • 枚举(ENUM)类型: 枚举类型允许您从一组预定义的选项中选择一个单独的值。在创建表结构时,你可以指定枚举类型的字段允许的值列表
    • 集合(SET)类型: 集合类型允许您从一组预定义的选项中选择多个值,这些值之间使用逗号分隔。与枚举类型不同,集合类型允许您选择多个选项,而不仅限于一项。
  6. 其他类型

    • BOOLEAN:在MySQL中没有专门的BOOLEAN类型,通常使用TINYINT(1)来表示布尔值,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和空字符串' '代表着不同的含义

  1. NULL:在数据库中表示缺少值或未知值。当一个字段的值未知或者不适用时,可以使用NULL来表示。NULL不等于任何其他值,包括空字符串。

  2. 空字符串' ':表示一个空的字符串值。当一个字段需要有值,但是没有具体数值或字符时,可以使用空字符串来表示。空字符串是一个有效的值。

  在mysql中,字符串可用单引号 ' '来引用,也可用双引号 " "来引用。例如 'It's a good day' 和 "It's a good day" 都是合法的字符串表示。一般情况下在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位有效数字的数据,但实际精度可能受到存储数据时的舍入误差的影响。我们接下来再看decimal类型。

2、2、2 decimal

  decimal用于精确存储数字,它表示定点数,能够保证精度不会丢失。decimal的语法格式为 DECIMAL(M, D),其中 M 表示总位数,D 表示小数点后的位数。例如,DECIMAL(10, 2) 表示总共 10 位,其中 2 位为小数位。其用法用float一样的。如下图:

  通过上图我们也能看到,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。我们看如下图:

  当我们修改char的长度为256时就会报错,并不允许我们进行修改操作。

3、2 varchar

  varchar也是用来存储字符的数据类型。使用方法与char相同。我们先看一下其具体使用例子。如下图:

  

  那么varchar 和 char 有什么区别呢就char(10)和 varchar(10)来说明无论char中实际存储的字符串长度是多少,char始终占用10个字符长度的存储空间。但是varchar是一种可变长度的字符类型意味着它只占用实际存储数据所需的存储空间我们在varchar中只存储5个字符的话,那么varchar只占用5个字符长度的空间

  关于 varchar(len),len 到底是多大,这个 len 值,和表的编码密切相关:
  • varchar长度可以指定为065535之间的值,但是有1 - 3 个字节用于记录数据大小(varchar是变长的),所以说有效字节数是 65532。
  • 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(因为utf中,一个字符占用3个字节),如果编码是gbkvarchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。

  我们看如下例子:

  我们看到当我们设置varchar的字符长度为21845时,就提示我们超过最大长度了。提示中给出的是65535个字节,并且包含了记录长度的字节数据。

3、3 char 和 varchar 比较

  我们不妨来对比一下 char 和 varchar的区别。

  1. CHAR数据类型:

    • CHAR是一种固定长度的字符类型,意味着它始终占用固定数量的存储空间。
    • 当定义一个CHAR列时,您需要指定该列的固定长度。例如,CHAR(10)表示该列将始终存储10个字符。
    • 无论实际存储的字符串长度是多少,CHAR始终占用指定长度的存储空间。
    • CHAR适合存储长度固定的字符串,例如邮政编码或固定长度的标识符。
  2. VARCHAR数据类型:

    • VARCHAR是一种可变长度的字符类型,意味着它只占用实际存储数据所需的存储空间。
    • 当定义一个VARCHAR列时,您需要指定该列可存储的最大长度。例如,VARCHAR(100)表示该列可以存储最多100个字符,但实际存储的字符串长度可以少于100个字符。
    • VARCHAR适合存储长度可变的字符串,例如用户输入的文本或变长的描述信息。

主要区别:

  1. 存储方式:CHAR是固定长度的,而VARCHAR是可变长度的。这意味着在使用CHAR时,数据将按固定长度存储;而使用VARCHAR时,额外的空间将被用来存储数据长度信息。
  2. 性能:CHAR由于固定长度和提前分配的空间,其性能通常比VARCHAR要快。特别是当已知要存储的字符串长度时。而VARCHAR因为其灵活性(读取时需要先读取存储字符串的长度,再访问指定长度的空间),可能稍慢一些。
  3. 空间使用:CHAR使用固定的空间来存储数据,因此可能会因为并没有使用全部空间而造成空间的浪费。但VARCHAR使用额外空间来存储数据长度信息,相对来说空间利用率较高。
  4. 可变字段:如果一个字段的数据长度可能会有所不同,使用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()的使用了。

  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中的数据类型进行了详解。同时也有一些问题并没有说明,比如int(10)中的10代表着什么含义。我们会在下篇文章表的约束中进行讲解。我们应该熟知这些数据类型,这也是我们后续所学的基础。

  感谢阅读ovo~ 

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

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

相关文章

海康G5系列(armv7l) heop模式下交叉编译Qt qmqtt demo,出现moc缺少高版本GLibc问题之解决

1.编辑源 sudo vi /etc/apt/sources.list 2.添加高版本的源 deb http://th.archive.ubuntu.com/ubuntu jammy main #添加该行到文件 3.运行升级 sudo apt update sudo apt install libc6 4.strings /**/libc.so.6 |grep GLIBC_ 参考链接:version GLIBC_2.3…

github 私人仓库clone的问题

github 私人仓库clone的问题 公共仓库直接克隆就可以,私人仓库需要权限验证,要先申请token 1、登录到github,点击setting 打开的页面最底下,有一个developer setting 这里申请到token之后,注意要保存起来&#xff…

【Python+requests+unittest+excel】实现接口自动化测试框架

一、框架结构: 工程目录 二、Case文件设计 三、基础包 base3.1 封装get/post请求(runmethon.py) 1 import requests2 import json3 class RunMethod:4 def post_main(self,url,data,headerNone):5 res None6 if header …

Stable Diffusion新手村-我们一起完成AI绘画

1.工具搭建 感谢bilibili的"秋葉aaaki"大佬出的整合包,让我们方便下载安装一键启动,去它的网盘里下载 我的显卡设备,暂时还够哈,出图速度还可以1-2分钟比较美的质感画面 下载以后需要解压下sd-webui-aki-v4.4.7z&#…

spring-cloud-alibaba-sentinel

sentinel (哨兵) 简介 # 官网 - https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_sentinel # github - https://github.com/alibaba/Sentinel/wiki# 简介 - 随着微服务的普及,服务调用的稳定性变得越来…

Eigen的基操

转自博客 博客

浏览器Cookie是什么?如何在MaskFog指纹浏览器中导入Cookie?

在使用互联网时我们常常听到cookie这个词,那到底什么是cookie呢? Cookie是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息客户端向服务器发起请求&…

【23真题】易,学硕爆冷,题目常规!

今天分享的是23年广州大学823的信号与系统试题及解析。广州大学23年学硕爆冷,一志愿全部录取,不知道24情况将如何。我们拭目以待! 本套试卷难度分析:本套试题内容难度中等偏下,考察的知识点都是比较常见的&#xff0c…

如何使用线性模型的【分箱】操作处理非线性问题

让线性回归在非线性数据上表现提升的核心方法之一是对数据进行分箱,也就是离散化。与线性回归相比,我们常用的一种回归是决策树的回归。为了对比不同分类器和分箱前后拟合效果的差异,我们设置对照实验。 生成一个非线性数据集前,…

【论文阅读】(CTGAN)Modeling Tabular data using Conditional GAN

论文地址:[1907.00503] Modeling Tabular data using Conditional GAN (arxiv.org) 摘要 对表格数据中行的概率分布进行建模并生成真实的合成数据是一项非常重要的任务,有着许多挑战。本文设计了CTGAN,使用条件生成器解决挑战。为了帮助进行公…

flutter下拉列表

下拉列表 内容和下拉列表的标题均可滑动 Expanded: 内容限制组件,将其子类中的无限扩展的界面限制在一定范围中。在此使用,是为了防止下拉列表中的内容超过了屏幕限制。 SingleChildScrollView: 这个组件,从名字中可…

C++——友元函数

如下是一个日期类&#xff1a; class Date { public:Date(int year 2023, int month 10, int day 1){_year year;_month month;_day day;if (_month < 1 || month > 12 || _day < 1 || _day > GetMonthDay(_year, _month)){cout << "日期不规范&…

元数据管理,数字化时代企业的基础建设

随着新一代信息化、数字化技术的应用&#xff0c;众多领域通过科技革命和产业革命实现了深度化的数字改造&#xff0c;进入到以数据为核心驱动力的&#xff0c;全新的数据处理时代&#xff0c;并通过业务系统、商业智能BI等数字化技术和应用实现了数据价值&#xff0c;从数字经…

hadoop 如何关闭集群 hadoop使用脚本关闭集群 hadoop(八)

1. hadoop22, hadoop23, hadoop24三台机器 2. namenode 所在hadoop22关闭 hdfs: # 找到/etc/hadoop位置 cd /opt/module/hadoop-3.3.4/etc/hadoop # 找到shell脚本&#xff0c;关闭即可sbin/stop-dfs.sh 3. 关闭yarn脚本&#xff0c;我的在hadoop23&#xff1a; # 找到/etc…

【云原生进阶之PaaS中间件】第三章Kafka-1-综述

1 Kafka简介 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各…

数据同步到Redis消息队列,并实现消息发布/订阅

一、假设需求&#xff1a; 某系统在MySQL某表中操作了一条数据在其他系统中&#xff0c;实时获取最新被操作数据的数据库名、数据表名、操作类型、数据内容 应用场景&#xff1a; 按最近项目的一个需求来说&#xff1a; 1.当某子系统向报警表中新增了一条报警数据&#xff1b;…

如何实现Redisson分布式锁

首先&#xff0c;不要将分布式锁想的太复杂&#xff0c;如果我们只是平时业务中去使用&#xff0c;其实不算难&#xff0c;但是很多人写的文章不能让人快速上手&#xff0c;接下来&#xff0c;一起看下Redisson分布式锁的快速实现 Redisson 是一个在 Redis 的基础上实现的 Java…

java导出excel思路

1、构建导出的数据模型&#xff0c; 这个模型可以自己画&#xff0c;也可以读取一个自己制作好的模板&#xff0c;根据模板填充数据&#xff0c;然后flush到一个新的excel文件。 1&#xff09;、自己画 GetMapping("/exportTemplate") public void exportTemp…

链表相关题目

一、反转单向链表 private static void reverseNode(Node head) {Node pre null;Node currentNode head;while (currentNode ! null) {Node next currentNode.next;currentNode.next pre;pre currentNode;currentNode next;}二、反转双向链表 private static void revers…

Live800:金牌客服常用的6大提问技巧

在客服行业&#xff0c;提问技巧是非常重要的一项技能。好的提问技巧不仅能够帮助客服人员更好地了解客户需求&#xff0c;还能够提高客户满意度和忠诚度。以下是金牌客服常用的6大提问技巧&#xff0c;希望能够对客服人员提升工作效率有所帮助。 1、开放性问题 开放性问题是指…