MySQL之数据类型

news2025/1/31 8:15:44

目录

一 数值类型

1 int类型,以tinyint为例

范围:

越界问题:

验证:

2 bit(位)

应用:

显示问题:

3 小数

1 float[(M,D)] [unsigned]

范围:

2 decimal

精度问题

二 文本、二进制类型

1 char(L)

对一个字符的理解:

对固定长度的理解:

对于空串:

示例

 2 varchar

变长:

L:

三 时间日期

四 String

存储

示例

插入

查询

对enum:

对set查询


 

前置理解:

MySQL中有非常多的数据类型。之所以会有这么多的数据类型,是因为我们会根据实际的应用场景去选择合适的结构类型。

比如说对于性别的选择,只有男女这样的选项的话,就可以设置成bit(1)。

不同的数据类型会有不同的特性,对于空间或者效率上的利用各有特色。因此我们学习数据类型,结合实际的应用场景,选择最适合应用场景的数据类型进行数据的存储。

存储数据的时候,数据类型的精细化,可以帮助我们更合理地使用文件空间。

我们分别从整形,浮点型,文本二进制类型,时间类型,String类型进行理解。

一 数值类型

1 int类型,以tinyint为例

范围:

由于默认是有符号的,所以在没有指定无符号的情况下,范围是-128——127.

但是如果是有符号的话,默认范围就是0——255

越界问题:

(默认是有符号类型进行创建)我们先插入几条在数据范围内的数据,发现可以被成功插入;我们插入在数据范围之外的数据,发现就会告警,不允许进行插入。

 

其实这时候我们就可以发现,MySQL对于越界问题的一个处理方式是直接告警,不能进行插入。这和我们之前学习语言的时候不太相同,为什么会发生这样的情况呢?

这和数据的存储和数据库的要求有关:数据库要求数据的存储具有可信度的。而数据在底层是以二进制的方式进行存储,如果超出了对应的存储范围,仍然要进行存储的话,就会发生截断。如果截断的话,数据的可信度就不高了。因此对于越界行为的处理,MySQL是直接进行警告不允许插入的。直接就终止了对应的操作。

也就是说:在MySQL中,只有符合数据范围的数据才会进行插入,否则就不能。

其实这样设计可以倒逼程序员去遵循对应的数据的规则,谨慎选择对应的数据类型,这也是约束的一种体现。约束程序员规范存储数据。

好处:MySQL有了这样的约束之后,就保证了数据库内部存储的数据都是可以预期的。(我们可以根据数据类型推测出存储的数据的一些性质)

总而言之,除了对功能性的基本需求之外,MySQL还有对非功能性的规范。数据类型的本质就是一种约束,约束程序员去规范输入,保证数据库内部存储的数据都是可以预期的

验证:

用无符号类型的数据类型再来验证上述的结论

 我们也能得到这样的结论。

其实我们声明unsigned的时候,除了对数据范围的一个声明,也声明了语义。比如人的年龄,身高,体重等不可能是负数,就可以用unsigned来存储。

我们存储的时候,使用tinyint存储不下的数据,tinyint unsigned可能也存储不下,这时候我们优先考虑的应该是是否能正确存放数据,对非功能性的要求就没有那么严格了,可以将tinyint提升为int或者bigint。

tinyint,int,bigint等都是类似的,只不过范围不同

2 bit(位)

声明bit的时候是这样声明的:

bit[(M)]

[]标识里面的内容可以省略,如果省略的话,默认就是1.里面的M标识位数,范围是从1——64

应用:

如果非常注重空间的话,就可以使用bit来存储。比如标识男女,是否是会员……

显示问题:

我们分别设定int和bit(8)的插入同一个数据,观察相应的产生的影响:存储的时候是可以存进去的,但是取的时候不太相同

我们分别对不同的类型插入相同的数字,会发现插入的时候是没有问题的,但是筛选的时候结果却不一致?

这和bit类型的数据存储有关:

相比于int,存的时候存的是int,取得是int。因此存取数据是一样的

但是bit的话,存的时候是按二进制存的,取得时候会以二进制的代码显示(ASCII码)。又因为数据库不让我进行截断,因此导致的一个影响是bit的有一些数据不可显。

但是对于这一部分不可显的数据仍然是存储在表中的,我们也可以通过条件筛选进行筛选出来

3 小数

1 float[(M,D)] [unsigned]

M标识显示的长度,D是小数点后的位数

实际存储位数和显示位数:我们之前格式化输出的时候指定位数,就是一个指定的显示长度。但是这个数据实际上存储的位数和显示的有区别的

范围:

如果我们是 float(4,2)的话,范围是-99.99——99.99 如果是float(4,1)的话,范围是-999.9——999.9以此类推

MySQL的小数是支持无符号的,这影响了数据范围,直接将负数的一部分舍去。

 

 我们可以看到对于浮点数会进行四舍存储,也就是即使超出了最后一个精度范围的位置我们依然可以填入数据。但是最后的结果是一样的。

(虽然不是取整,但是对比零向取整的思想是差不多的)

2 decimal

decimal使用的时候和float等是差不多的,只不过精度上更精确

decimal[(m,d)] [unsigned]

m指定长度,d表示小数点的位数

精度问题

为什么存储更精确?

浮点数的存储肯定会有精度损失的问题的。整数部分的规则/2取余数,小数点部分*2取整,小数点可能无法取整完毕。

float表示的精度大约是7位,

decimal m最大是65,d最大是30.如果被省略,m默认是10,d默认是0.

如果我们期望浮点数的精度更高,推荐使用decimal

二 文本、二进制类型

1 char(L)

是一个固定长度的字符串,L表示可以存储的长度,单位是字符,最大是255

对一个字符的理解:

在MySQL中,一个字符既可以代表一个英文字母,又可以代表一个汉字(这与语言中有所区别,语言中一个汉字可能是多个区别)

对固定长度的理解:

不管有没有用到对应的长度,该定长字符串都会用长度L的字符空间来存储

对于空串:

这里我们插入的时候可能会有空串,这是在筛选的时候不显示的。但是实际上又有数据

示例

最后一行是空串

 2 varchar

varchar(L)

和char的理解差不多,不过他是一个可变长度的字符串,L标识字符长度,最大可以是65535个字节。

变长:

<=的意思。如果超过规定的范围仍然是不允许插入的。变长的话最后存储的时候会根据实际存储的数据改变长度,起到节省空间的效果(同等的,会牺牲一部分的效率)

L:

他有两部分:1——3个字节用来记录数据大小,有效字节:65532。

因为要是变长的,肯定会有对应的部分记录数据的大小,会根据有效存储的数据的长度决定使用多少个字节数保存。

除去这一部分,剩下的都是我们可以用来保存数据的空间。需要注意的是,如果我们使用utf8编码的话,对于L最大只能写21844 。(utf编码一个字符3个字节),同理对于gbk,L最大是32766

 对比char和varchar类型

定长可能会造成空间的浪费,但是效率比较高

变长节省了磁盘空间,但是相应的效率比较低

因此我们应该根据实际的需求进行选择

三 时间日期

常用的有以下三类

date 'yyyy-mm-dd' ,占用三字节

datetime 'yyyy-mm-dd HH:ii:ss' 占用8字节

timestamp:时间戳 格式和datetime完全一致,占用四字节

创建三列分别用来存储对应的类型,timestamp比较特殊,不为空并且默认值是当前的时间戳。我们利用这个类型的时候,会自动更新插入对应数据的时间。是由系统自动获取的

四 String

Stirng有enum和set两个类型,

enum:枚举,单选类型

set:集合,多选类型

存储

enum的存储:

该类型提供了若干选项的值,但是实际存储的时候只是存储了一个值,并且实际是按照数据进行存储的。对应正常的数组下标

约束性更强,只能在枚举的选项中进行选择,如果超出对应的选项就会报错。

set的话,数据存储也是在底层存储的数字。但是存储的时候,实际上是利用了位图这样的结构进行存储的(在之前的Linux选项的章节中介绍过,这里不介绍)

示例

插入

 

 0,1标识有无,具体的数据标识具体的值

查询

对enum:

既可以利用下标又可以利用对应的选项进行查找

对set查询

由于set的底层是位图,所以我们只用=查找的话,只能筛选出只有的,而非包含的。如果要筛选出包含的话,应该用对应的函数进行查找

find_in_set

mysql> select * from person where find_in_set('代码',hobby);

find_in_set的第一个参数是标识需要查找的对应的条件,第二个是在哪里查找。比如上述的语句就是在hobby里查找包含代码的数据

 

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

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

相关文章

TCP分包和粘包

文章目录TCP分包和粘包TCP分包TCP 粘包分包和粘包解决方案&#xff1a;TCP分包和粘包 TCP分包 场景&#xff1a;发送方发送字符串”helloworld”&#xff0c;接收方却分别接收到了两个数据包&#xff1a;字符串”hello”和”world”发送端发送了数量较多的数据&#xff0c;接…

神策数据荣获“MarTech 领域最具商业合作价值企业”称号

近日&#xff0c;数据猿 2023 年度 3 月“企业盘点”活动落下帷幕&#xff0c;《2023 中国 MarTech 领域最具商业合作价值企业盘点》正式对外发布。神策数据依托在 MarTech 领域的专业度与知名度&#xff0c;被评为“MarTech 领域最具商业合作价值企业”。本次盘点活动从企业相…

pytorch 线性回归总结

测试1(y3∗x1−4∗x2y3*x_{1}-4*x_{2}y3∗x1​−4∗x2​),lr1e-2 %matplotlib inline import torch import numpy as np torch.manual_seed(1) from torch.nn import Linear from torch.autograd import Variable import torch.nn as nn import random np.random.seed(1) rand…

代码随想录-68-669. 修剪二叉搜索树

目录前言题目1.按照二叉搜索树特性遍历整棵二叉搜索树&#xff0c;2. 本题思路分析&#xff1a;3. 算法实现4. 算法坑点前言 我在刷卡哥的“代码随想录”&#xff0c;自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 题目 1.按照二叉搜索树特性…

JavaWeb开发 —— JavaScript(JS)

目录 一、什么是JavaScript &#xff1f; 二、引入方式 三、基础语法 1. 书写语法 2. 输出语句 3. 变量 4. 数据类型 5. 运算符 6. 类型转换 四、函数 五、对象 1. Array数组 2. String 字符串 3. JSON 4. BOM 5. DOM 六、时间监听 一、什么是JavaSc…

MAE论文笔记+Pytroch实现

Masked Autoencoders Are Scalable Vision Learners&#xff0c; 2021 近期在梳理Transformer在CV领域的相关论文&#xff0c;落脚点在于如何去使用Pytroch实现如ViT和MAE等。通过阅读源码&#xff0c;发现不少论文的源码都直接调用timm来实现ViT。故在此需要简单介绍一下timm…

Vulnhub_Pylington

目录 一、信息收集 &#xff08;一&#xff09;端口服务探测 &#xff08;二&#xff09;目录扫描 二、漏洞挖掘 &#xff08;一&#xff09;robots敏感信息泄露 &#xff08;二&#xff09;python IDE沙箱绕过RCE 1. python敏感函数沙盒绕过 2. exec(__import_…

2.3 连续性随机变量

思维导图&#xff1a; 学习目标&#xff1a; 我会按照以下步骤学习连续型随机变量&#xff1a; 复习概率论的基础知识&#xff0c;包括概率、期望、方差等概念和公式&#xff0c;以及离散型随机变量的概率分布函数和概率质量函数的概念和性质。 学习连续型随机变量的概念和性…

在线文章生成-自动文章生成

文章生成软件 文章生成软件是一种能够自动生成文章的创作工具&#xff0c;可以大幅提高创作效率并节省创作成本。使用文章生成软件可以有效缩短文章的创作时间&#xff0c;尤其是在大批量的文章生产和时间紧迫的情况下&#xff0c;有着重要的作用。以下是文章生成软件可以为我…

初识C++之位图与布隆过滤器

一、位图 1.位图的概念 在了解位图前&#xff0c;先来看这么一道题&#xff1a; 假设给你40亿个没有排序的不重复的无符号整数。再给你一个无符号整数&#xff0c;让你判断这个整数是否在这40亿个数之中。 对于这道题&#xff0c;一般情况下的解法有很多&#xff0c;例如二…

如何利用空号检测 API 降低企业的业务成本

引言 电话营销和短信营销是现代营销活动的重要手段&#xff0c;但是无效号码的存在导致了很多资源浪费。利用空号检测 API 就可以避免企业向无效号码发送营销信息&#xff0c;降低营销成本。 本文将介绍空号检测 API 的工作原理以及如何利用空号检测 API 降低业务成本的多种方…

十分钟教你部署一个属于自己的chatgpt网站

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

( “树” 之 DFS) 543. 二叉树的直径 ——【Leetcode每日一题】

543. 二叉树的直径 给定一棵二叉树&#xff0c;你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例 : 给定二叉树 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。 注意 &#xff1a;两结点之间…

屏幕色彩(一)-已知混色光色点求配色比

文章目录计算公式html源码运行结果计算公式 [WxWyWz][M][RGB]\begin{gather} \begin{bmatrix} W_x\\ W_y\\W_z \end{bmatrix} \begin{bmatrix} M \end{bmatrix} \begin{bmatrix} R\\G\\B \end{bmatrix} \end{gather} ​Wx​Wy​Wz​​​[M​]​RGB​​​​ 其中&#xff0c;Wxw…

STM-32:串口收发数据包—串口收发HEX数据包/串口收发文本数据包

目录一、发送HEX数据包1.1固定包长&#xff0c;含包头包尾&#xff08;包尾不是必须的&#xff09;1.2可变包长&#xff0c;含包头包尾二、接收HEX数据包三、发送文本数据包3.1固定包长&#xff0c;含包头包尾3.2可变包长&#xff0c;含包头包尾四、接收文本数据包五、HEX数据包…

73-Linux_线程安全

线程安全一.什么是线程安全二.strtok和strtok_r1.strtok2.strtok_r三.多线程中执行fork1.多线程中某个线程调用 fork()&#xff0c;子进程会有和父进程相同数量的线程吗&#xff1f;2.父进程被加锁的互斥锁 fork 后在子进程中是否已经加锁 ?一.什么是线程安全 线程安全即就是…

【数据结构】时间复杂度详解

首先我们要知道学习数据结构时都会讨论到算法&#xff0c;数据结构中的问题多数都有算法解决&#xff0c;两者是你中有我&#xff0c;我中有你的关系&#xff0c;所以在数据结构中的学习中算法也是必不可少的。 为方便阅读&#xff0c;以下为本片目录 目录 1.算法效率 1.1 …

JavaScript的学习理解

文章目录一、JavaScript 对象二、JavaScript 函数三、JavaScript 作用域总结一、JavaScript 对象 JavaScript 对象是拥有属性和方法的数据。 真实生活中的对象&#xff0c;属性和方法 在 JavaScript中&#xff0c;几乎所有的事物都是对象。 在 JavaScript 中&#xff0c;对象…

Spring5学习笔记01

一、课程介绍 Spring是什么呢&#xff1f; 它是一个轻量级的、开源的JavaEE框架&#xff0c;它的出现是为了解决企业繁琐的开发包括复杂代码&#xff0c;它可以用很优雅、很简洁的方式进行实现&#xff0c;也就是说它为了简化企业开发而生&#xff0c;而它在目前的企业中应用…

大规模MySQL运维陷阱之基于MyCat的伪分布式架构

引子 分布式数据库&#xff0c;已经进入了全面快速发展阶段&#xff0c;这种发展&#xff0c;是与时俱进的&#xff0c;与人的需求是分不开的&#xff0c;因为现在信息时代的高速发展&#xff0c;导致数据量和交易量越来越大。这种现象首先导致的就是存储瓶颈&#xff0c;因为…