[MySQL] MySQL中的数据类型

news2024/11/26 5:29:22

 

  在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.coloradmin.cn/o/1208259.html

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

相关文章

[黑马程序员Pandas教程]——Pandas读取保存数据

目录: 学习目标读写文件 写文件读取文件 index_col参数指定索引parse_dates参数指定列解析为时间日期类型encoding参数指定编码格式读取tsv文件Pandas读写文件小结读写数据库 安装pymysql包将数据写入数据库从数据库中加载数据总结项目地址 1.学习目标 能够使用Pan…

吊打Fast Request还免费? 这款插件真心好用!

今天给大家推荐一款IDEA插件:Apipost Helper,比Fast Request更好用并且完全免费!三大亮点功能:写完代码IDEA内一键生成API文档;写完代码IDEA内一键调试,;生成API目录树,双击即可快速…

keil5暗色主题配置

在keil文件目录下找到global.prop 将以下内容替换至该文件即可 # properties for all file types indent.automatic1 virtual.space0 view.whitespace0 view.endofline0 code.page0 caretline.visible0 highlight.matchingbraces1 print.syntax.coloring1 use.tab.color1 crea…

PostgreSQL基本操作

目录 1.源码安装PostgreSQL 1.1.前置条件(root下操作) 1.1.1.卸载yum安装的postgresql 1.1.2.创建postgres用户 1.1.3.安装部分依赖 1.1.4.源码安装uuid 1.2.安装PostgreSQL 1.2.1.使用postgres用户管理PostgreSQL 1.2.2.下载解压postgres12源码…

【算法每日一练]-图论(保姆级教程 篇1(模板篇)) #floyed算法 #dijkstra算法 #spfa算法

今天开始讲图论 目录 图的存储 算任意两点的最短路径: floyed算法: 算一个点到其他所有点的最短距离 dijkstra算法: spfa算法: 图的存储 其实:邻接矩阵和链式向前星都能存边的信息,vector只能存点的信息,再搭配上v[]…

【JUC】四、可重入锁、公平锁、非公平锁、死锁现象

文章目录 1、synchronized2、公平锁和非公平锁3、可重入锁4、死锁 1、synchronized 写个demo,具体演示下对象锁与类锁,以及synchronized同步下的几种情况练习分析。demo里有资源类手机Phone,其有三个方法,发短信和发邮件这两个方…

加速可编程创新,2023年英特尔FPGA中国技术日披露全矩阵FPGA产品与应用方案

在新场景、新应用海量增长的驱动下,中国本地市场对于FPGA产品的需求也在日益多元化和快速扩展。我们始终致力于以中国客户的实际需求为导向,基于领先的FPGA产品和软件为千行百业提供全场景的解决方案。——叶唯琛 英特尔可编程方案事业部中国总经理 今日…

智能运维软件,提升效率的利器

随着信息技术的飞速发展,企业对于IT系统的依赖程度日益加深。为保障IT系统的稳定运行,越来越多的企业选择智能运维管理软件,以全面高效的监控和管理系统和资产情况。 一、运维监控平台的重要性 无监控,不运维。将资产并入监控系…

盘点72个ASP.NET Core源码Net爱好者不容错过

盘点72个ASP.NET Core源码Net爱好者不容错过 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 链接:https://pan.baidu.com/s/1nlQLLly_TqGrs5O8eOmZjA?pwd8888 提取码:8888 项目名称 (Chinese) 物业收费…

敏捷开发中如何写好用户故事

写好用户故事是敏捷开发中非常重要的一环,它们是描述用户需求的核心。以下是一些关于如何编写优秀用户故事的建议: 使用标准模板: 一个常用的用户故事模板是“As a [用户角色],I want [功能],so that [价值]”。这种模…

flutter下拉列表

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

JavaScript中的原型和原型链

给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 原型和原型链是JavaScript中一个重要且常常被误解的概念。它们在理解对象、继承和属性查找时扮演着关键的角色。 1…

智慧城市项目建设介绍

1. 项目建设背景 随着城市化进程的加速,城市发展面临着诸多挑战,如环境污染、城镇综合管理、经济发展布局等。为了应对这些挑战,智慧城市应运而生,成为城市发展的重要方向。智慧城市通过运用信息技术和智能化技术,实…

腾讯云标准型S5服务器五年优惠价格表(4核8G和2核4G)

腾讯云服务器网整理五年云服务器优惠活动 txyfwq.com/go/txy 配置可选2核4G和4核8G,公网带宽可选1M、3M或5M,系统盘为50G高性能云硬盘,标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器,…

(六)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB

一、七种算法(DBO、LO、SWO、COA、LSO、KOA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

libgdx实现雪花、下雪效果(二十三)

libgdx实现雪花、下雪效果(二十三) 转自:https://lingkang.top/archives/libgdx-shi-xian-xue-hua package effect;import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.lwjgl3.…

腾讯云4核8G和2核4G服务器五年优惠价格表

腾讯云百科整理五年云服务器优惠活动 txybk.com/go/txy 配置可选2核4G和4核8G,公网带宽可选1M、3M或5M,系统盘为50G高性能云硬盘,标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器,睿频3…

【C++】join ()和detach ()函数详解和示例

简单的来说,join ()方法建立的线程具有阻碍作用,该线程不结束,另一些函数就无法运行。detach ()方法建立的线程,可以和另一些函数同时进行。下面以示例进行详细说明,以帮助大家理解和使用。 目录 join ()detach () jo…

Java —— 继承

目录 1. 为什么需要继承 2. 继承概念 3. 继承的语法 4. 父类成员访问 4.1 子类中访问父类的成员变量 1. 子类和父类不存在同名成员变量 2. 子类和父类成员变量同名 4.2 子类中访问父类的成员方法 1. 成员方法名字不同 2. 成员方法名字相同 5. super关键字 6. 子类构…

腾讯云CVM服务器5年可选2核4G和4核8G配置

腾讯云服务器网整理五年云服务器优惠活动 txyfwq.com/go/txy 配置可选2核4G和4核8G,公网带宽可选1M、3M或5M,系统盘为50G高性能云硬盘,标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器,…