首页 > 数据库 >【基础篇】四、MySQL数据类型

【基础篇】四、MySQL数据类型

时间:2024-12-31 09:26:16浏览次数:3  
标签:set 字节 数据类型 浮点数 enum 基础 MySQL 类型

文章目录

Ⅰ. 数据类型分类

在这里插入图片描述

​ 上图列举了 mysql 中的数据类型,其实我们主要分为四种类型来讲解,数据类型比较接近的比如说 tinyintsmallintint 等几个类型,我们只会挑其中一个来讲,因为其它都是类似的!

Ⅱ. 数值类型

1、整数类型

​ 这里以 tinyint 类型为例,我们结合例子来看现象,主要测试一下数据的越界情况!

​ 下面先创建一个数据库 test_db,然后创建一个表 t1,其中存放的类型就是 tinyint

在这里插入图片描述

​ 接着我们向 t1 中插入一些不超出 tinyint 范围的数据

在这里插入图片描述

​ 下面我们向里面插入几个超过 tinyint 范围的数据:

在这里插入图片描述

至此,我们可以得出一些结论:

  • 如果我们向 mysql 特定类型中插入不合法(类型不同或者超出数据范围)的数据,mysql 是直接报错拦截的,不让我们进行对应的操作!
  • 反过来,如果我们已经有成功地插入数据到 mysql 中的话,那么这个数据一定是合法的!
  • 所以一般而言,数据类型本身也是一种 约束(这个我们以后会经常碰到)
    • 所谓的约束就是限制使用者的一些不合法操作!
    • 这样子才能保证数据库中的数据是可预期的、完整的!

​ 下面我们再演示一下如何创建无符号类型的数据,其实就是在数据类型后面加一个 unsigned 即可:

在这里插入图片描述

​ 注意:尽量不使用 unsigned,对于 int 类型可能存放不下的数据,int unsigned 同样可能存放不下,与其如此,还不如设计时,将 int 类型提升为 bigint 类型。

2、位类型 – bit

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

​ 下面我们创建一个表,在表中存放 bit 类型的数据:

在这里插入图片描述

注意事项:

  • bit 字段在显示时,是按照 ASCII 码对应的值显示。所以如果想通过 select 语句查看的话,需要使用 hex() 函数将其转化为十六进制格式才能看得到!

    在这里插入图片描述

  • 申请超过 bit 的数据类型范围也会报错!

    在这里插入图片描述

3、小数类型

① 浮点数类型

​ 浮点数类型有 floatdouble,这里我们以 float 类型为例!

​ 其语法如下所示:

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

注意实现:

  • mysql 在保存小数时会进行四舍五入
  • 一般来说浮点数的范围是根据 md 来进行把控的。如果我们在定义数据类型的时候,不带上 md 的话,那么该浮点数会默认按照我们插入的数据大小做存储,但是会有一些精度损失
  • 此外,浮点数类型在 mysql 中也是有无符号类型的,其作用只是砍掉了负数那部分,而正数部分的取值范围依然还是那样子!

​ 举个例子,下面我们创建一个 m=4d=2 的浮点数类型,其范围也就顺理成章的为 -99.99 ~ 99.99,如下所示:

在这里插入图片描述

​ 下面我们试着往里面插入多条数据:

在这里插入图片描述

② 固定精度的十进制数类型 – decimal

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

​ 在 mysql 中,decimal 类型用于存储精确的十进制数值。float 类型不同,decimal 类型不会丢失精度,并且可以存储较大的数值范围decimal 类型的大小是可变的,可以指定精度和小数位数。它的存储需求取决于指定的精度和小数位数。

​ 注意,虽然 decimal 类型可以存储小数值,但它 不是浮点数类型它是一种固定精度的十进制数类型,它以字符串形式存储,并且不会丢失精度。与浮点数类型(如 floatdouble)不同,decimal 类型可以精确表示十进制数值,而不会引入舍入误差(但是计算过程也会有四舍五入)。

​ 而浮点数类型(如 floatdouble)使用二进制表示法来存储数值,因此在进行计算时可能会引入舍入误差。因此,如果需要进行精确计算或存储货币金额等需要确切数值的场景,建议使用 decimal 类型而不是浮点数类型。

​ 下面我们的操作主要是用来区分一下浮点数类型和 decimal 类型的精度:

在这里插入图片描述

说明:

  • float 表示的精度大约是 7 位。
  • decimal 整数最大位数 m65,其中支持小数最大位数 d30
    • 如果 d 被省略,默认为 0
    • 如果 m 被省略,默认是 10

Ⅲ. 字符串类型

1、char类型

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

注意事项:

  • 这里说单位为字符,不只是指 ascii 字符,也可以是 gbk、utf8 等编码字符!

在这里插入图片描述

2、varchar类型

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

varchar 类型的使用和 char 基本是一样的,这里主要介绍其编码的注意事项以及区别!

注意事项:

  • 虽然说 L 表示长度,单位也是字符,但是可以看到 varchar 数据类型的最大长度是以字节为单位的,这是为了适应不同的编码格式而设定的,其最大的长度不超过 65535 个字节,也就是说,L 是随不同编码格式而有不同的取值范围的
  • 但是因为规定有 1~3 个字节用于记录数据的大小(这是动态开辟的,也就是说当一个字节不够表示大小了才会使用两个、三个字节),所以实际 最大长度实际上是 65532~65534 个字节
    • 举个例子:
      • 如果我们使用的是 utf8 也就是每个字符占用三个字节的话,那么总共只能用 65532/3 = 21844 个字符。
      • 如果我们使用的是 gbk 也就是每个字符占用两个字节的话,那么总共只能用 65532/2 = 32766 个字符。
  • 此外,如果表中不止有一列字段的话,那么此时 varchar 的最大字节可能要变得更小

在这里插入图片描述

3、char和varchar的比较

​ 如下表,举了个例子,很快就能看懂它们的区别:

在这里插入图片描述

如何选择定长或变长字符串❓❓❓

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

Ⅳ. 日期类型

常用的日期有如下三个:

  • date
    • 格式为 'yyyy-mm-dd' ,占用 三字节
    • 只有日期,并且只能手动更改
  • datetime
    • 格式为 'yyyy-mm-dd HH:ii:ss' 表示范围从 10009999 ,占用 八字节
    • 有日期也有时分秒,但是只能手动更改
  • timestamp
    • 时间戳,从 1970 年开始的 'yyyy-mm-dd HH:ii:ss' 格式,这和 datetime 完全一致,占用 四字节
    • datetime 唯一不同的是,当我们 插入或者更新一条记录的时候,会自动设置为当前的日期和时间,这种自动更新的行为是由 MySQL 的内部机制控制的,不需要手动操作。

​ 我们先创建一个表,分别带有这三种日期类型:

在这里插入图片描述

​ 下面我们插入数据,并做修改来看看区别:

在这里插入图片描述

Ⅴ. enum类型与set类型

1、语法

  1. enum(枚举):允许在列中定义一个值列表,然后 只能从该列表中选择一个值
    • 我们可以通过直接用列表中的值,或者通过其选项值,这些选项的每个选项值依次对应如下数字:123,…最多 65535 个,所以当我们添加枚举值时,也可以添加对应的数字编号!
      • 例如,如果有一个名为 gender 的列,并且只允许选择 “男” 或 “女” 作为值,可以将该列定义为 enum("男", "女")。在这种情况下,列只能包含这两个值中的一个,或者可以选择为空。
  2. set(集合):类似于 enum,但允许 从一个值列表中选择多个值
    • 我们可以通过直接用列表中的值,或者通过其选项值,这些选项的每个选项值依次对应如下数字:124816,…最多 64 个,这是有原因的,这个结合下面的例子来讲会更清晰!
      • 例如,如果有一个名为 hobbies 的列,并且允许选择多个爱好,您可以将该列定义为 set('读书', '篮球', '跳舞', 'Rap')。在这种情况下,列可以包含这些值中的任意组合,或者可以选择为空。
  3. 此外,enum 是从下标 1 开始获取元素的,而 set 则是从下标 0 开始获取元素的(虽然元素是空集)。

​ 此外,使用 enumset 数据类型时,可以在创建表时指定默认值,例如 gender enum('男', '女') default '女'

​ 需要注意的是,enumset 数据类型在某些情况下可能会有一些限制。例如,当值列表很长时enum 可能会占用更多的存储空间,而 set 可能会有一些查询和索引方面的限制。因此,在使用这些数据类型时,需要根据具体情况进行权衡和选择。

​ 下面来举个例子,创建一张表,这个表中有 enumset 两个类型的数据,前者用于选择性别,后者用于选择爱好:

在这里插入图片描述

​ 然后向表中插入数据,先来测试一下 enum 的特性(图中已经说明细节):

在这里插入图片描述

​ 下面再来测试一下 set 的特性:

在这里插入图片描述

​ 可以看到,enum 不同的是,set 是支持多选的

​ 除此之外,上面查询出来的结果中居然有一个是空的结果,其实这只是 代表一个空集,它是存在的,只不过没有内容,并不代表是 NULL,注意区分开

​ 但是不是很奇怪,set 的测试中有这么奇怪的现象❓❓❓

​ 其实一点都不奇怪,你说为什么 set 叫做 set,其实就是集合的意思,当我们通过 0 下标进行访问到的是一个空集;通过 1 下标访问到的是第一个元素;通过 2 下标访问到的是第二个元素;通过 3 下标访问到的是前两个元素的集合;而通过 4 下标访问到的是第三个元素……

​ 是不是找到规律了,其实我们 用下标访问的时候,就相当于是一个位图,比特位为 1 的那个选项就会被选上,如下所示:

在这里插入图片描述

​ 既然是这样子,那么我们想一下,我们要同时列举出五个选项的集合,那就是 11111,就是 31,我们试试看用下标 31 是不是得到该集合:
在这里插入图片描述

2、set的查询:find_in_set()

​ 现在我们有一个要求,就是查询当前结果集中含有 ‘跳舞’ 的结果,如下所示:

在这里插入图片描述

​ 可以看到,where 语句(这个后面会讲!)已经没办法很好的帮我们查询出来了。

​ 此时我们就要借用一个函数 find_in_set(),其 用于在逗号分隔的字符串列表中查找指定值的 MySQL 函数。它的功能是返回指定值在字符串列表中的位置。

​ 函数语法如下所示:

find_in_set(value, string_list)

​ 其中,value 是要查找的值,string_list 是逗号分隔的字符串列表。

​ 函数返回一个整数值,表示 valuestring_list 中的位置。如果找到了匹配的值,则返回其下标;如果未找到匹配的值,则返回 0

​ 比如说这样子用:

在这里插入图片描述

​ 所以我们就可以 用该函数配合 where 语句和 and 语句来查找对应的集合选项

在这里插入图片描述

标签:set,字节,数据类型,浮点数,enum,基础,MySQL,类型
From: https://blog.csdn.net/lirendada/article/details/144839291

相关文章

  • MySQL 账号没有密码该如何处理?
    当发现MySQL账号没有密码时,首先可以参考服务器提供商提供的相关文档或知识库,如某些服务器管理平台会有关于MySQL账号密码管理的特定指南(如faq/list.asp?unid=876)。如果是在特定的建站助手中使用MySQL,可能需要在其界面中查找与账号密码设置相关的功能模块,看是否能够在其中设......
  • 将复杂数据类型封装在字符串中
    希望得到一个数组或对象的字符串表示,以便存储在一个文件或数据库中。使用serialize()将变量及其值编码为一种文本形式://定义一个数组,其中包含食品名称作为键,食品数量作为值$pantry=array('sugar'=>'2lbs.','butter'=>'3sticks');//尝试以写入模式('w')打开一个名为'......
  • 一名程序员决定学点会计基础知识
    1.概述企业是一种以营利(即获取经济利润)为目的的经济组织。在会计看来,企业一辈子其实只做了三件事:经营、投资和筹资。在正常情况下,企业的经济活动是一个川流不息的过程。这一过程也是运用、分配及耗用企业经济资源的过程。由于资金是企业经济资源的货币表现形式或价值表现形式,......
  • 【网络基础知识】两台电脑不在一个城市,如何使这两台电脑构成一个局域网?
    两台电脑即使不在一个城市,通过一些非常规的技术方法,依然可以实现这两台电脑间的局域网构建。具体构建方法大致有以下几种,下面我们具体来了解一下。首先我们应对局域网有一个清晰认识,局域网简称LAN,是在一个具体区域内实现多台计算机设备的互联互通,在局域网内实现文件管理,数据共享......
  • 20. C++快速入门--并发基础
    参考:《Professionalc++》,《并发编程实战》1基本概念1.1竞争原子性"原子"(atomic)操作是指一种不可分割的操作,即在执行过程中不会被中断的操作。这种操作要么完全执行,要么完全不执行,不会出现部分执行的情况。应用场景计数器:在多线程环境下安全地递增或递减计数器。标......
  • 《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
    @目录二、高级篇(大厂进阶)1.Docker复杂安装详说1.1安装mysql主从复制1.2安装redis集群1.2.1面试题:1~2亿条数据需要缓存,请问如何设计这个存储案例哈希取余分区一致性哈希算法分区哈希槽分区1.2.23主3从redis集群扩缩容配置案例架构说明整体流程图知识点总结图使用步骤:注意点说明......
  • 【PHP开发】PHP后端基础
    一、PHP基本概念详解PHP是一种服务器端脚本语言,常用于动态网站开发和web应用程序。以下是PHP的基本概念与特点的详细说明:1.1PHP文件的默认文件扩展名PHP文件的扩展名通常为.php,例如index.php。PHP文件可以包含PHP代码、HTML、CSS和JavaScript。Web服务器会通......
  • 【信息系统项目管理师】第14章:项目沟通管理-基础和过程 考点梳理
    更多内容请见:备考信息系统项目管理师-专栏介绍和目录文章目录14.1管理基础14.1.1沟通14.1.2沟通模型14.1.3沟通分类14.1.4沟通技巧14.1.5管理新实践14.2项目沟通管理过程14.2.1过程概述14.2.2裁剪考虑因素14.2.3敏捷与适应方法......
  • 慧集通iPaaS低代码平台培训-基础篇
    训练使用素材: 1.数据源:单号业务日期工厂仓库物料单位数量批次0100012022-5-1210031001030001kg500202304150100012022-5-1210031001030001kg122202304150100012022-5-1210031001030001kg1250202304150100012022-5-1210031001030002kg130202304110100012022-5-121003100103......
  • 六年时间【万字总结】—kali Linux系统的各种报错问题解决方法,网络安全零基础入门到精
    是从玩kalilinux做主力物理机五六年时间中遇到问题,下面基本上是算是一个小总结吧,从Ubuntu到Kali到Arch在到Kali都是泪每一个问题都是要花费半天,甚至几个星期去解决的问题,下面问题总共时长估计有小半年花费时间研究问题解决和系统美化,折腾过linux应该都董不管是美化还是......