当前位置: 首页 > news >正文

【MySQL】数据库知识突破:数据类型全解析与详解

        前言:本节内容讲述MySQL的数据类型,  我们在学习之前的建表的时候已经用过各种各样的数据类型。 比如int、varchar、char类型等等。其中它们是对表的结构的操作, 并没有对数据的内容进行操作,所以它叫做DDL。另外,还有许多其他的数据类型以及其中的细节我们并不清楚。 本节就是具体的对于MySQL中的数据类型进行一些列讲解。

        ps:本节内容建议学习了建库和建表的友友们进行观看。 

目录

数值类型 

tinyint

bit类型

浮点类型

float

decimal

字符串类型

char

varchar

日期和事件类型

enum和set 

enum

set

 如何查找


数值类型 

        数值类型主要有tinyint(1字节)smallint(2字节)mediumint(3字节)int(4字节)bigint(8字节)等,这么多类型都叫做整数类型。其中如果不加unsigned默认为带符号的整形,, 带上unsigned叫做不带符号的整形类型。         

tinyint

        我们先在创建一个表, 这个表里面只有一个tinyint类型:

        然后我们对立面进行插入:

        我们插入之后就会发现,当我们插入-128可以, 插入-127也可以, 插入127也可以。 但是插入128就不行了, 插入-129就不行了。 并且报错说了超出范围。

        然后创建一个无符号的tinyint类型, 然后我们再插入负数就不行了。 并且整数我们可以插入到了255。 负数和256以上都差入不了。

         也就是说, 这个和我们的语言是不一样的。语言如果插入的太大, 语言就会帮助我们进行截断。但是mysql不能截断,该插入多少就是多少, 超过了这个范围就插入失败!!反过来, 如果我们已经有数据插入到了mysql中, 那么这个数据就一定是合法的。 所以,mysql中, 一般而言, 数据类型本身也是一种约束!!!就能保证数据库中的数据是可预期、合法的。

        ps:smallint 、midumint、int类型和tinyint类似, 这里不做演示。

bit类型

        bit类型,为类型。 使用的时候就是bit(M)。M指定位数, 默认为1, 范围是1 ~ 6。

        

我们创建一个bit类型, 大小为1,那么我们插入的时候, 特定字段就不能插入超过2。 

浮点类型

float

        float类型如何使用呢? 

        float[(m, d)]:这里面的m指定的是显示的长度, d指定的是小数的位数。整个float占用4个字节。

        下面我们创建一个float类型的表, 来进行插入示范一下:

        上面我们是创建一个4个位数, 然后小数点后面指定必须是2位。 然后也就是说整数部分一定只能是2位。

        然后, 我们一开始就是正常插入99.99, 显然可以插入; float是有符号的,所以我们插入-99.99的时候也可以插入;如果我们的整数部分插入的时候不是两位而是大于两位, 999.99, 那么就不能插入, 因为规定了整数部分必须是两位。 即便是999.9也不可以, 因为整数部分必须是两位; 当小数部分插入的时候不是两位, 如果是小于两位就补零。 相当于插入99.9其实插入的是99.90;如果小数部分插入的时候大于两位, 那么就进行四舍五入, 比如99.994234324324, 那么对第二位的后一位进行四舍五入为99.99。 但是如果是99.995, 四舍五入为100.00所以就不行了。 

        ps: 那么对于有符号的float(4, 2)类型, 范围是(-99.99 ~ 99.99) 。 无符号是(0 ~ 99.99) ,这里不做讲解,自行验证。

 现在我们使用一下float的默认的存储范围:

        我们会发现,我们插入了一个很大的数字, 但是他只给我们存储了整数的部分, 并且整数的部分也不准, 也有精度损失。 所以我们就能观察到, 其实float是有精度损失的。 

decimal

        decimal也是浮点类型。 float如果存储的数字很大就不准了, 但是decimal不会。 decimal的用法和float类似, 也是decimal[m, d]:m指定长度, d指定小数部分的位数。

        我们下面进行两者的对比:

 

        我们的float和decimal都是用了(10, 8), 也就是两个整数位, 8个小数位。 然后插入相同的数据我们会发现两者的插入结果不一样。 其中float的类型插入的数据精度丢失, 而decimal的精度没有丢失。 

字符串类型

char

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

        我们创建的char(2), 意思就是创建的两个字符的类型。 然后我们插入一个'a', 可以插入; 插入'ab'可以插入; 插入'abc', 不可以插入了。 说明一个字符就是占用一个位。 char(2)就可以插入两个字符。 但是我们如果插入一个汉字”中', 可以插入, 为什么插入'中国'也可以插入呢?我们知道, 一个汉字在utf8中是3个字节。 所以,我们就可以推断, 在mysql中的一个字符, 不同于语言一个字符就是一个字节。 mysql的一个字符就是一个字符, 一个汉字也是一个字符!!

varchar

        varchar是边长字符串。 他的最大长度是65535, 比char要大。

        由上面的例子我们就可以看到, varchar类似于char, 也是一个汉字就是一个字符。 括号里是多少, 就是创建多少字符的类型。 

        现在,我们看一下下面这个:

        我们创建一个65535大小的varchar类型,就会报错说类型太大了。 但是我们上面不是说varchar的类型最大时65535吗? 这里的65535是说的字节, 而不是字符个数。而字符数就是他说的这个16383。 

        另外 , 关于varchar(len), 这个len到底是多大, 和表的编码是相关的。 根据一个字符占多少来进行计算出来的。 比如utf8就是65535 / 3 = 21845, gb就是65535 / 2 = 32767. 在mysql8.0里面是utf8mb4, 和上面有不一样。 并且, 如果是char, 我们要len个字符, 就是给我们6个字符的空间。 但是对于varchar, 我们虽然要了len个字符, 但是如果实际中我们只是用了1个字符, 那么varchar就只会给我们1个字符的空间, 这个len对于varchar只是一个上限。

        还有, varchar中其实有1 ~ 3个字节用于记录数据大小, 所以我们实际上varchar最大的字节数是65535 - 3。

然后char和varchar的优缺点就很容易看出来:

  •         varchar变长:效率低, 节省空间。
  •         char定长:效率高, 浪费空间。

日期和事件类型

        date:日期,'yyyy-mm-dd'占3个字节。

        datetime:日期和时间,'yyyy-mm-dd HH:ii:ss' 占8个字节。

        timestamp:时间戳, 从1970年开始进行计算, 占用4个字节。

enum和set 

enum

        enum是枚举类型, 枚举类型是我们只能在枚举出来的选项中选择一个。 是多选一:

        我们如果创建一个gender枚举男和女。 我们插入的时候如果插入男, 可以插入; 如果插入女, 也可以。 但是如果插入别的, 就不行了。 

        但是, 我们可以插入1和2:

        这是因为在枚举中, 枚举变量的下标是从1开始的, 然后以此类推。 我们进行插入时, 也可以利用下标来代指枚举变量。

set

还是我们上面的t12这个表:

        在插入的过程中, 我们有可能遇到这种情况, 就是我们一个人, 比如说赵六, 他既喜欢游泳, 又喜欢写代码。 那么怎么办呢? 这个就要用到集合:

        所以, 我们插入集合的方法就是一个' ', 中间可以写集合里面的元素,中间用逗号分割。

        另外, 我们如果想要让数字表示集合的元素。 规则和枚举不一样。 这里使用的是二进制来表示对应位置的元素有没有进行插入。 就比如我们上面创建的表, 我们的表的集合里面一共有四个元素。 如果全部插入就是1111(二进制); 如果是不插入游泳就是111; 如果插入不插入乒乓球, 就是1101; 如果不插入代码, 不插入羽毛球, 插入乒乓球和游泳就是1100。现在来测试:

 如何查找

        查找enum比较简单, 执行select where语句即可:

        查找set, 假如我们想要查找只喜欢羽毛球的人容易查找, 直接select where:

        但是如果我们想要的是喜欢羽毛球的人, 这些人也肯能喜欢乒乓球, 可能喜欢游泳啥的。 这个时候它们就不能被选到。所以这里就要用到一个函数find_in_set。 select 是可以执行函数的。 这个find_in_set的作用就是查找集合里面的某一个元素, 并且返回这个元素的下标。 如果返回0, 那么没有查找到: 

  ——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!    

相关文章:

【MySQL】数据库知识突破:数据类型全解析与详解

前言:本节内容讲述MySQL的数据类型, 我们在学习之前的建表的时候已经用过各种各样的数据类型。 比如int、varchar、char类型等等。其中它们是对表的结构的操作, 并没有对数据的内容进行操作,所以它叫做DDL。另外,还有…...

使用Golang实现开发中常用的【实例设计模式】

使用Golang实现开发中常用的【实例设计模式】 设计模式是解决常见问题的模板,可以帮助我们提升思维能力,编写更高效、可维护性更强的代码。 单例模式: 描述:确保一个类只有一个实例,并提供一个全局访问点。 优点&…...

【Java学习】电脑基础操作和编程环境配置

CMD 在Windows中用命令行的方式操作计算机。 打开CMD Win R输入CMD按下回车键 Win E 进入我的电脑 常用的CMD命令 盘符名称冒号 说明:盘符切换 举例:E:回车,表示切换到E盘 dir 说明:查看当前路径下的内容 cd目录 说明&a…...

AVL树解析

目录 一. AVL的概念 二 AVL树的插入 2.1先按二叉搜索树的规则插入 2.2 AVL的重点:平衡因子更新 3.1 更新后parent的平衡因子等于0。 3.2 更新后parent的平衡因子等于1 或 -1,需要继续往上更新。 3.3 更新后parent的平衡因子等于2 或 -2,需…...

栈和队列(Java)

一.栈(Stack) 1.定义 栈是限定仅在表尾进行插入或删除操作的线性表 一般的表尾称为栈顶 表头称为栈底 栈具有“后进先出”的特点 2.对栈的模拟 栈主要具有以下功能: push(Object item):将元素item压入栈顶。 pop()&am…...

C#设计原则

文章目录 项目地址一、开放封闭原则1.1 不好的版本1.2 将BankProcess的实现改为接口1.3 修改BankStuff类和IBankClient类二、依赖倒置原则2.1 高层不应该依赖于低层模块2.1.1 不好的例子2.1.2 修改:将各个国家的歌曲抽象2.2 抽象不应该依于细节2.2.1 不同的人开不同的车(接口…...

easyfs 简易文件系统

easyfs easyfs 简易文件系统文件系统虚拟文件系统 VFS简易文件系统 easyfs磁盘布局超级块 easyfs 文件系统结构磁盘上的索引结构索引节点Inode 和 DiskInode 之间的关系举例说明读取文件的过程( /hello ) 参考文档 easyfs 简易文件系统 文件系统 常规文…...

【架构论文-1】面向服务架构(SOA)

【摘要】 本文以我参加公司的“生产线数字孪生”项目为例,论述了“面向服务架构设计及其应用”。该项目的目标是构建某车企的数字孪生平台,在虚拟场景中能够仿真还原真实产线的动作和节拍,实现虚实联动,从而提前规避问题&#xff…...

刚刚!更新宁德时代社招Verify测评语言理解数字推理SHL题库、网盘资料、高分答案

宁德时代社招入职的Verify测评主要分为两大块:语言理解和数字推理。语言理解部分包括阅读理解、逻辑填空和语句排序,要求在17分钟内完成30题。数字推理部分包括数字序列、数学问题解决和图表分析,同样要求在17分钟内完成18题。这些测评题目旨…...

C++笔记---智能指针

1. 什么是智能指针 1.1 RALL设计思想 RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种资源管理类的设计思想,广泛应用于C等支持对象导向编程的语言中。它的核心思想是将资源的管理与对象的生命周期紧密绑定…...

CentOS 7系统中更改YUM源为阿里云的镜像源

引言 更换阿里的镜像源可以带来诸多好处,包括提高下载速度、提升稳定性、同步更新、简化配置、节省带宽资源以及增强系统安全性等。因此,对于使用CentOS系统的用户来说,更换阿里的镜像源是一个值得考虑的选择。 1.备份yum源 mv /etc/yum.r…...

Python酷库之旅-第三方库Pandas(206)

目录 一、用法精讲 961、pandas.IntervalIndex.mid属性 961-1、语法 961-2、参数 961-3、功能 961-4、返回值 961-5、说明 961-6、用法 961-6-1、数据准备 961-6-2、代码示例 961-6-3、结果输出 962、pandas.IntervalIndex.length属性 962-1、语法 962-2、参数 …...

3.4CQU数学实验???

meshgrid 是一个用于生成网格点坐标的函数。它常用于在二维或三维空间中创建坐标网格,用于可视化和数据处理。 在二维情况下,meshgrid 函数接受两个一维数组作为输入,并返回两个二维数组,这两个数组中的元素分别表示了所有可能的…...

Linux(CentOS)开放端口/关闭端口

一、普通用户使用 sudo 操作,开放/关闭端口,80 1、检查端口是否开放 sudo firewall-cmd --zonepublic --query-port80/tcp 2、开放端口 sudo firewall-cmd --zonepublic --add-port80/tcp --permanent 3、重新加载(开放或关闭端口后都需…...

GreenDao适配AGP8.7+

升级配置 工具版本Android StudioLadybug 2024.2.1 Path2AGP8.7.2KPG1.8.21GGP3.3.1明细 classpath "com.android.tools.build:gradle:$agp_version"classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kgp_version"classpath "org.greenrobot:g…...

【前端】Typescript从入门到进阶

以下是 TypeScript 的常用知识点总结,涵盖了从基础到入门的内容,并配有代码示例: 1. TypeScript 基础 1.1 安装和配置 安装 TypeScript 并初始化配置文件: npm install -g typescript tsc --init 1.2 基本类型 TypeScript 提供…...

在 RHEL 8 | CentOS Linux release 8.5.2111上安装 Zabbix 6

1. 备份YUM源文件 cd /etc/yum.repos.d/ mkdir bak mv C* ./bak/ wget -O /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo yum clean all yum makecache2. 将 SELinux 设置为宽容模式,如下所示。 sudo s…...

光纤HDMI线怎么连接回音壁?

第一步:准备HDMI线、光纤线(TOSLINK线)、视频源设备、回音壁 第二步:连接HDMI线,找到视频源设备上的HDMI输出口,将HDMI线的一端插入这个接口,再把HDMI线的另一端插入回音壁的HDMI输入口。注意检…...

屏幕后期处理

1、屏幕后期处理效果 屏幕后期处理效果( Screen Post-Processing Effects)是一种在渲染管线的最后阶段应用的视觉效果,允许在场景渲染完成后对最终图像进行各种调整和效果处理,从而增强视觉体验 常见的屏幕后期处理效果有&#x…...

K8资源之endpoint资源EP资源

1 endpoint资源概述 endpoint资源在K8S中用来表s示vc与后端 Pod 之间的连接关系的对象。当创建svc时,svc根据标签是否相同或svc名字是否和ep名字相同,把svc和ip关联上。 删除svc时,会自动的删除同名的ep资源。 2 ep资源和svc的关联测试 […...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

JavaSec-RCE

简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性&#xff0c…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...