【MySQL】数据类型

上期我们在建表的时候用到了很多数据类型,下面就来详细讲解这些数据类型


目录

一、数据类型分类

二、对于一些数据类型的分析

2.1 数值类型

2.1.1 有符号和无符号类型

2.1.2 bit类型

2.1.3 浮点型

2.1.3.1 float

2.1.3.2 decimal

2.2 字符串类型

2.2.1 char

2.2.2 varchar

2.3 日期和时间类型

2.4 枚举和集合类型

2.4.1 enum类型

2.4.2 set类型


一、数据类型分类

我们先来概览一下MySQL下有哪些数据类型:  

分类数据类型说明
数值类型BIT (M)位类型。M指定位数,默认值1,范围1~64
TINYINT [UNSIGNED]带符号的范围-128~127,无符号范围0~255。默认有符号
BOOL使用0和1表示真和假
SMALLINT [UNSIGNED]带符号范围-2^15~2^15-1,无符号范围0~2^16-1
INT [UNSIGNED]带符号范围-2^31~2^31-1.无符号范围0~2^32-1
BIGINT[UNSIGNED]带符号范围-2^63~2^63-1,无符号范围0~2^64-1
FLOAT[(M,D)] [UNSIGNED]M指定数据总位数,D指定小数位数,占用4字节
DOUBLE[(M,D)] [UNSIGNED]表示比float精度更大的小数,M指定数据总位数,D指定小数位数,占用空间8字节
DECIMAL(M,D) [UNSIGNED]定点数M指定数据总位数,D表示小数点的位数
字符串、文本类型CHAR(SIZE)固定长度字符串,最大255
VARCHAR (SIZE)可变长度字符串,最大长度65535
BLOB二进制数据
TEXT大文本,不支持全文索引,不支持默认值
时间和日期类型DATE日期类型(yyyy-mm-dd)
DATETIME日期类型(yyyy-mm-dd hh:mm: ss)
TIMESTAMP时间戳
枚举和集合类型ENUM类型ENUM是一个字符串对象,其值来自表创建时在列规定中显示枚举的一列值
SET类型SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个set成员的set列值时各成员之间用逗号间隔开。这样set成员值本身不能包含逗号。

接下来对一些常用类型进行讲解:

二、对于一些数据类型的分析

2.1 数值类型

2.1.1 有符号和无符号类型

在MySQL中,有的数值类型可以指定是有符号的和无符号的,默认是有符号的(这里拿TINYINT举例):

在上面我们创建了一个t1表,该表只有一个tinyint类型的属性列num,现在我们向这个表里面添加点数据:

我们可以看到可以向列中插入负数和正数,说明在没有UNSIGNED说明下该类型默认为有符号数

另外可以通过UNSIGNED来说明某个字段是无符号的:

向其插入数据: 

不过要注意了,我们无法向其中插入超出该类型存储范围的数: 


如果我们向mysql特定的类型中插入不合法的数据,MySQL一般都是直接拦截我们,不让我们做对应的操作!

所以在mysql中,数据类型本身也是一种约束,这样可以保证数据库中的数据是可预期,完整的。
 

2.1.2 bit类型

下面我们建一张存有bit类型的表t3:

 现在我们向其中插入一些数据:

我们可以看到bit类型也是有限制的,因为我们创建的比特位只有一位,所以只能插入0和1两种数据

我们查看一下表中的数据看看:

奇怪,bit类型的数据怎么不打印出来呢?

这是因为bit类型的数据默认按ASCII编码的数据来打印,而0和1对应的格式是不显示的。

不过我们可以使用语句将其以十进制的格式打印出来

2.1.3 浮点型

2.1.3.1 float

我们可以定义float类型来表示小数:

float[(m, d)] [unsigned] 

M指定数据总位数,d指定小数位数,占用空间4个字节

下面来分析一下float类型的使用:

我们现在向t4表中插入数据:

我们创建t4时float类型并没有使用unsigned说明,可以看到正负数都可以表示

现在我们继续向t4中插入数据:

我们可以看到上面三个数据不合法插入不了,这是因为我们在刚开始定义float时规定了其数据总位数为4个,其中小数位数占2个:当我们插入100.0这样类型的数据时整数位数为3个,但是不管我们100后面加的是几位小数,系统都会默认为两位,所以导致数据总位数为5位,超过了我们当初定义的范围。

那我们向该类型中插入小数位数超过两位数的数据呢?

这时系统可以让我们插入小数位数超过两位数的数据,不过显示出来还是两位小数的数据,并且会在原有数据的第二位小数位后面四舍五入!

如果按照超过规定小数位的数据后的数据进行四舍五入,那我们下面插入这样的数据试试看:

我们可以看到如果四舍五入过后的数据总位数没有超过规定位数是可以插入的,如果超过了就不合法了

在接下来,我们另创一个表,在该表内部设置一个float属性列,不过这个float类型我们并没有用来限定数据位数的类型:

我们向里面插入数据:

咦?这么大的数据也给插?我们来看看表中数据的情况:

 

这和原数据差别也太大了吧,所以我们可以看到原生的float虽然不会限制我们插入数据,但是数据位数过于多会造成精度的丢失!

2.1.3.2 decimal

decimal和float很像,但是有区别: float和decimal表示的精度不一样

我们现在来验证一下:

上面我们在一张表中创建了float(10,8)和decimal(10,8)两种类型的列f和d

现在我们存入相同的数据来看看:

我们看到float类型的数据最后一位与原数据不一样了

所以如果希望小数的精度高,推荐使用decimal类型。

2.2 字符串类型

2.2.1 char

char(L)

L是可以存储的长度,单位为字符,最大长度值可以为255

现在来实践一下:

插入数据:

我们可以看到当字符数超过2时就不让我们插入了,这个可以理解

下面我们用中文试试看:

居然也可以!我们知道在utf8编码下一个汉字占3个字节,两个汉字即6个字节

现在我们可以得出我们限定char类型的存储的长度时,真正是以字符为单位的,而不是字节。

 

2.2.2 varchar

varchar(L)

L表示字符长度

varchar类型存储容量最大为65535个字节,所以L最大值与编码格式有关

varchar类型最大虽然可以存储65535个字节,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532字节

当我们的表的编码是utf8时,varchar(L)的参数L最大值是65532/3=21844[因为utf中,一个字符占 用3个字节],如果编码是gbk,varchar(L)的参数L最大是65532/2=32766(因为gbk中,一个字符 占用2字节)

varchar类型的使用与char类型是一样的,那如何选择定长或变长字符串?

如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号

如果数据长度有变化,就使用变长(varchar), 比如:名字,地址。 

定长的磁盘空间比较浪费,但是效率高。 变长的磁盘空间比较节省,但是效率低。

定长的意义是,直接开辟好对应的空间(类似于C语言中char类型数组)

变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少(类似于C++中的容器string)

2.3 日期和时间类型

常用的日期主要有下面三个:

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

datetime:时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节

timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节(timestamp数据类型的列不需要对其做修改)

话不多说,下面我们接着演示:

我们创建了t8这个含有date、datetime、timestamp三种数据类型的表,下面我们来插入数据:

可以看到,我们向表中插入数据时,timestamp类型的t3会自动记录当前的时间

那接下来我们对插入的数据做一些修改:

我们可以看到,当我们对数据做出修改时,该数据对应行中timesamp类型的数据会自动更新当前的时间!

2.4 枚举和集合类型

2.4.1 enum类型

enum('选项1','选项2','选项3'...)

enum类型可以提供若干个选项的值,插入数据时一个单元格中只能存储其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535 个;当我们添加枚举值时,也可以添加对应的数字编号。(这和C语言中的enum类型很像)

上面的说明过于生涩,我们下面用实例帮助理解:

现在我们向表中插入数据:

我们可以看到向表中插入数据时,不仅仅可以用enum里定义的字符串,还可以使用字符串对应的数字下标。在本表中enum类型中的'男'、'女'从左到右分别对应1、2这两个下标。

现在我们再来插入一些其他数据看行不行:

答案是不行的,我们在向enum类型中插入数据时只能插入其中存有的数据,使用下标时只有有效的下标才能生效。像这里的enum类型只有'男'、'女'分别对应1、2这两个下标,所以除了1/2其他的下标都是不合法的。

2.4.2 set类型

set('选项1','选项2','选项3'...)

set类型可以提供若干个选项的值,插入数据时一个单元格中可以存储其中任意多个值;而且出于效率考虑,这些值实际存储的是二进制数字,因为这些选项的每个选项值依次对应如下二进制数字:1(1),10(2),100(4),1000(8),10000(16),100000(32),.... 最多64个。

下面举例进行详解:

我们下面进行一些数据的插入:

我们可以看到set类型的列,一个单元格可以插入多个选项中的数据

下面我们试试看set类型是否可以像enum类型那样使用下标进行数据的插入:

咦?1和2是按照数据的下标进行插入的,怎么3就不是了呢?

这是因为enum类型插入数据的数字不是选项的下标,我们要把数字转化为二进制来看:

在该enum类型中一共有四个选项,分别对应着一位二进制数:

这时我们将数字3转换位4位的二进制数:0011

其中0代表没有该数位对应选项的数据,1代表有该数位对应选项的数据

这样子3表示的二进制数表示在1和2数位有对应选项的数据,而3和4数位没有对应选项的数据

即有set类型中选项1和选项2的数据,没有选项3和选项4的数据:

所以就造成了最后一个赵六的hobby列有篮球和滑雪两个数据

以此类推,下面插入4这个数字对应的二进制为0100:

所以我们可以看到最后一行的hobby列的数据只有一个高尔夫。

如果我们要想将选项全部选上呢?那对应的二进制数为1111,转换为十进制就是15:

不过下面有一种特殊情况:

当我们输入数字0时,即表示什么选项都没有,这时会插入一个空串作为数据。

在最后提一下set类型的查找往往要用到MySQL的内置函数find_in_set() ,该函数我们在后期会详细讲解。


本期博客到这里就结束了,我们下期不见不散~

更多MySQL技能请看:http://t.csdn.cn/W9dQl

博主努力更新中~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--基础知识

数据结构是什么? 数据结构是计算机科学中研究数据组织、存储和管理的方法和原则。它涉及存储和操作数据的方式,以便能够高效地使用和访问数据。 相关内容 基本组成 数组(Array):数组是一种线性数据结构,…

数据管理基础知识

数据管理原则 数据管理与其他形式的资产管理的共同特征,涉及了解组织拥有哪些数据以及可以使用这些数据完成哪些工作,然后确定如何最好的使用数据资产来实现组织目标与其他流程一样,他必须平衡战略和运营需求,通过遵循一套原则&a…

【Linux】揭秘:提升dd命令效率的秘密武器!

红帽RHCE试听课程:如何快速实现对服务器密码爆破?https://mp.weixin.qq.com/s/JUpf8G86jvnNwvKLUfWcLQ 红帽RHCE试听课程:linux系统下,用这个命令可以提高60%的工作效率https://mp.weixin.qq.com/s/pZVjMI1PLJzrA8hoPzkgMA 大家好…

机器学习深度学习——Dropout

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——权重衰减 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 Drop…

使用火山云搜索ESCloud服务构建图文检索应用(以文搜图/以图搜图)

图文检索在生活中具有广泛的应用,常见的图片检索包括基于文本内容搜索和基于图片内容搜索。用户通过输入文字描述或上传图片就可以在海量的图片库中快速找到同款或者相似图片,这种搜索方式被广泛应用于电商、广告、设计以及搜索引擎等热门领域。 本文基…

TCP三次握手四次挥手

一、TCP三次握手四次挥手 1.三次握手: 第一次握手:客户端发送syn包(seqx)到服务器,并进入SYN_SEND(发送)状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ac…

redis五种数据类型介绍

、string(字符串) 它师最基本的类型,可以理解为Memcached一模一样的类型,一个key对应一个value。 注意:一个键最大能存储 512MB。 特性:可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512…

计划管理与项目管理:有何区别?

简而言之,是的。尽管它们经常互换使用并对全局产生影响,但它们是完全不同的。 在本文中,我们将了解计划和项目管理之间的差异,提供每个示例,并向您展示如何使计划和项目管理工作更有效地实现您的业务目标。 计划管理与…

程序员面试金典17.*

文章目录 17.01 不用加号的加法17.04 消失的数字17.05字母与数字17.06 2出现的次数17.07 婴儿名字17.08 马戏团人塔17.09 第k个数17.10 主要元素17.11 单词距离17.12 BiNode17.13 恢复空格(未做,字典树dp)17.14 最小K个数17.15 最长单词17.16…

python爬虫-加速乐cookie混淆解析实例小记

注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! 第一步:抓包工具第一次请求页面,得到响应。本次我使用的fiddle进行抓包&#…

网易云音乐扫码登录

简介 尚硅谷的网易云音乐项目无法登录,因为目前网易修改了接口使用手机号和密码登录的话需要先通过认证才可以,所以目前无法使用手机号登录,只能使用二维码登录,接下来我就教大家如何使用 二维码进行登录 实现步骤 1.获取nodejs接…

【1.4】Java微服务:服务注册和调用(Eureka和Ribbon实现)

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 微服务 ✨特色专栏: 知识分享 &#x…

排序八卦炉之选择、堆排

文章目录 1.选择排序1.1代码实现1.2复杂度 2.堆排序2.1代码实现2.2复杂度 1.选择排序 1.1代码实现 // 当数据趋于有序或随机(可能部分有序) 插排更有优势 O(N)~O(N^2) //选择排序:O(N^2) O(N^2)~O(N^2) void …

【shell】获取ping的时延数据并分析网络情况及常用命令学习

文章目录 获取ping的时延数据并分析网络情况|、||、&、&&辨析teetailkillall 获取ping的时延数据并分析网络情况 网络情况经常让我们头疼,每次都需要手动在终端ping太麻烦了,不如写个脚本ping并将数据带上时间戳存入文件,然后也…

如何克服看到别人优于自己而感到的焦虑和迷茫?

文章目录 每日一句正能量前言简述自己的感受怎么做如何调整自己的心态后记 每日一句正能量 行动是至于恐惧的良药,而犹豫、拖延,将不断滋养恐惧。 前言 虽然清楚知识需要靠时间沉淀,但在看到自己做不出来的题别人会做,自己写不出的…

软件测试缺陷报告

缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告Software Bug Report(SBR)或软件问题报告Software Problem Report(SPR) 作用:缺陷报告是软件测试人员的工作成果之一,体现软件测试的价值缺陷报…

Pytorch深度学习-----神经网络之线性层用法

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Co…

<van-empty description=““ /> 滚动条bug

使用 <van-empty description"" /> 时&#xff0c;图片出现了个滚动条&#xff0c;图片可以上下滑动。 代码如下&#xff1a; <block wx:if"{{courseList.length < 0}}"><van-empty description"" /> </block> <…

python与深度学习(十):CNN和cifar10二

目录 1. 说明2. cifar10的CNN模型测试2.1 导入相关库2.2 加载数据和模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章训练的模型进行测试。首…

主流开源监控系统一览

减少故障有两个层面的意思&#xff0c;一个是做好常态预防&#xff0c;不让故障发生&#xff1b;另一个是如果故障发生&#xff0c;要能尽快止损&#xff0c;减少故障时长。而监控的典型作用&#xff0c;就是帮助我们发现及定位故障&#xff0c;这两个环节对于减少故障时长至关…