【MySQL系列】深入学习数据类型

news2025/2/5 11:53:07

「前言」文章内容大致是数据库的数据类型。

「归属专栏」MySQL

「主页链接」个人主页

「笔者」枫叶先生(fy)

MySQL

目录

  • 一、数据类型分类
  • 二、数值类型
    • 2.1 tinyint类型
    • 2.2 bit类型
    • 2.3 小数类型
      • 2.3.1 float类型
      • 2.3.2 decimal类型
    • 2.4 字符串类型
      • 2.4.1 char类型
      • 2.4.2 varchar类型
      • 2.4.3 char和varchar比较
    • 2.5 时间日期类型
    • 2.6 enum和set

一、数据类型分类

C/C++语言有自己的数据类型,MySQL也有自己的数据类型,常见的的数据类型如下:
在这里插入图片描述
注:带红色的是下面要讲解的类型

数据类型的作用:

  • 决定了存储数据时应该开辟的空间大小。
  • 决定了数据的取值范围。

二、数值类型

2.1 tinyint类型

接下来讲解数值类型的整型,整型的取值范围跟C/C++语言的数据类型取值范围都差不多,同样有有符号和无符号的区别
在这里插入图片描述

整型以tinyint为例

创建一个表,表当中包含一个tinyint类型的列,默认其为有符号类型
在这里插入图片描述
圆括号4,下一个篇章约束再谈,这里暂时不理会
在这里插入图片描述
tinyint类型占用1字节,有符号tinyint的取值范围为-128~127,进行插入数据
在这里插入图片描述
如果插入的数据不在-128~127范围,则不允许插入,报错:
在这里插入图片描述

下面是无符号tinyint范围测试

创建一个表,表当中包含一个tinyint类型的列,并指定其为无符号类型
在这里插入图片描述
tinyint类型占用1字节,无符号tinyint的取值范围为0~255,进行插入数据:
在这里插入图片描述
如果插入的数据不在0~255范围,则不允许插入,报错:
在这里插入图片描述
注意:向MySQL插入不合法的数据,MySQL会直接拦截我们的操作;如果我们已经将数据成功插入表中,那么插入的数据一定合法的。所以在MySQL中,数据类型本身就是一种约束。

从上面的例子也可以看出,MySQL表中建立属性列是列名字在前,类型在后

num(列名) tinyint(类型)

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

以上便是tinyint的介绍,其他整型也类似,不再演示

2.2 bit类型

基本语法:

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

注:[] 的部分可以省略

创建一个表,表当中包含一个int类型和一个bit类型,bit默认为1位
在这里插入图片描述
向表中插入数据,一个bit位只允许插入0,1
在这里插入图片描述
查看表的数据,发现bit类型不显示,根本原因是因为bit类型在显示时,是按照ASCII码对应的值进行显示的,有些字符是不可显示的
在这里插入图片描述
如果要查看该值,强转为十进制
在这里插入图片描述
修改表,改成 bit(10)
在这里插入图片描述
再次插入数据,结果证明确实是按ASCII码对应的值进行存储
在这里插入图片描述
bit(M),M最大值是64,如果超过了创建表就会失败
在这里插入图片描述
如果我们有这样的需求,只存放0或1,这时可以定义bit(1),这样可以节省空间

2.3 小数类型

2.3.1 float类型

语法:

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

创建一个表,包含一个float(4,2)类型的列,默认其为有符号类型
在这里插入图片描述
float(4,2)表示的范围是-99.99 ~ 99.99,在该范围内可以插入数据,超过范围报错
在这里插入图片描述
尝试插入超过范围的
说明:MySQL在保存值时会进行四舍五入
在这里插入图片描述
即使输入多位小数,也会按指定的格式显示
在这里插入图片描述
注意:无符号float类型的取值范围,实际就是把对应有符号float类型中的负数部分砍掉了,因此float(4,2)的取值范围为0~99.99

还有一个问题要注意,float类型会精度丢失问题
在这里插入图片描述

2.3.2 decimal类型

语法:

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
  • decimal(5,2) 表示的范围是 -999.99 ~ 999.99
  • decimal(5,2) unsigned 表示的范围 0 ~ 999.99
  • 这点与float是一样的

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

测试精度

创建一个表,表当中分别包含一个float(10,8)的列和一个decimal(10,8)的列
在这里插入图片描述
向表当中插入数据,查表结果float则会存在一定的精度损失,decimal则没有
在这里插入图片描述

  • float表示的精度大约是7位
  • decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略, 默认是10(可能会受到MySQL版本影响)

decimal的精度更准确,因此如果我们希望某个数据表示高精度,可以选择decimal

2.4 字符串类型

2.4.1 char类型

语法:

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

测试:

创建一个表,表当中包含一个char(2)列
在这里插入图片描述
插入数据,需要注意的是,在MySQL里,这里所说的字符并不与C/C++里面的字符相同,在MySQL里一个汉字也是一个字符

在不同编码中,一个字符所占的字节个数是不同的,比如utf8中一个字符占3个字节,而gbk中一个字符占2个字节
在这里插入图片描述

2.4.2 varchar类型

语法:

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

测试:

创建一个表,表当中包含一个varchar(2)
在这里插入图片描述
插入数据,varchar在这与char没什么区别
在这里插入图片描述

varchar类型注意事项

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

  • varchar长度可以指定为0到65535字节之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532
  • 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(因为 utf8 中,一个字符占用3个字节)
  • 如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符 占用2字节)

在这里插入图片描述
在这里插入图片描述

2.4.3 char和varchar比较

char和varchar比较

  • char类型可存储字符上限为255,varchar类型可存储字符上限与表的编码格式有关。
  • char(L)定义后,无论存储的字符串长度是否到达L,都会开辟用于存储L个字符的定长空间,如果存储的字符串长度超过L则会报错。
  • varchar(L)定义后,会根据存储字符串的长度按需开辟空间,并且需要使用1-3字节的空间用于表示存储字符串的长度以及其他控制信息,如果存储的字符串长度超过L则会报错。

以utf8编码为例:
在这里插入图片描述

如何选择定长(char)或变长字符串(varchar)?

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

2.5 时间日期类型

常用的日期有如下三个:

  • date :日期 yyyy-mm-dd ,占用三字节
  • datetime 时间日期格式yyyy-mm-dd HH:ii:ss表示范围从1000 到 9999,占用八字节
  • timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节

创建一个表,表当中包含date、datetime和timestamp三种时间日期类型的列

查看表结构可以看到,timestamp类型的t3列是不允许为空的,它的默认值为CURRENT_TIMESTAMP

如果向表中插入数据,t3会自动更新到最新时间(无需手动插入)
在这里插入图片描述
向表中插入值
在这里插入图片描述
更新数据,时间戳会更新
在这里插入图片描述

2.6 enum和set

enum:枚举,“单选”类型;

enum('选项1','选项2','选项3',...);
  • 该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值(只允许选取其中的一个值)
  • 出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....,最多65535个;当我们添加枚举值时,也可以添加对应的数字编号

set:集合,“多选”类型:

set('选项值1','选项值2','选项值3', ...);
  • 该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值(可以选取其中的一个或多个值)
  • 出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,....,最多64个

注意:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读

例子

创建一个调查表,表当中包含被调查人的姓名、性别(只选一个)和爱好(多个)
在这里插入图片描述
向表中插入记录时,被调查人的性别只能从男和女中进行二选一,被调查人的爱好可以从提供的若干个选项中进行多选一或多选多,多个爱好之间需要通过英文逗号隔开
在这里插入图片描述

可以通过数字设置enum

数字是从1开始,有几个值数字最大就是几,例如enum(‘男’, ‘女’),数字1代表男,数字2代表女,最大就是2,超过了范围则不允许插入
在这里插入图片描述
根本原因在于,MySQL出于效率考虑,这些值(比如男,女)实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....,最多65535

可以通过数字设置set

在插入记录时,除了通过指明多个选项来设置爱好,还可以通过数字的方式来设置
使用数字插入并不是使用下标,使用的是位图的方式进行插入
例如:

'羽毛球','游泳','篮球','写代码' // 4个爱好
用比特位表示:0000
0001 (1)是羽毛球
0010 (2)是游泳
0011 (3)是羽毛球,游泳
0100 (4)是篮球
依次类推
1111 (15)则是'羽毛球','游泳','篮球','写代码'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
:虽然enum和set可以通过数字的方式进行设置,但严重不推荐这种做法,因为这样的SQL可读性太差

enum和set查找

如果想要筛选出调查表中的所有女的或男的,那么直接在筛选时指明gender='女'或者gender='男'即可
在这里插入图片描述
但如果要筛选出调查表中爱好包含游泳的就不能使用where了,这并不是我们想要的结果
在这里插入图片描述

集合查询使用find_ in_ set函数:

  • find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;
  • str_list字符串是用逗号分隔的字符串

在这里插入图片描述
--------------------- END ----------------------

「 作者 」 枫叶先生
「 更新 」 2023.7.17
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。

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

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

相关文章

高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术应用

能源是国民经济发展和人民生活必须的重要物质基础。在过去的200多年里,建立在煤炭、石油、天然气等化石燃料基础上的能源体系极大的推动了人类社会的发展。但是人类在使用化石燃料的同时,也带来了严重的环境污染和生态系统破坏。近年来,世界各…

如何快速又高质量的输出PDF实验报告?

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 PDF文档的打印在很多应用场景中都会被使用到,最为常见的就是实验室信息管理…

rockchip linux Vendor storage 及SN添加

前言 在产品开发过程中,最后都会为产品编辑一个产品编号方便于管理和维护,而SN(Series Number)就是用于产品的生产编号。但是在linux中,并没有专门管理串码的驱动。 Vendor storage 是rockchip 被设计用来存储 SN,MAC,LAN,BT 等 vendor data。特征如下: 唯一的访问…

一些有意思的SCI

Gardner J K, Knopoff L. Is the sequence of earthquakes in Southern California, with aftershocks removed, Poissonian?[J]. Bulletin of the seismological society of America, 1974, 64(5): 1363-1367. [原文] 该论文的abstract只有一个单词:Yes。 目前该论…

MySQL索引使用原则,什么是覆盖索引、索引下堆、离散度……这些概念你弄明白了吗

文章目录 一、索引失效的场景二、列的离散度三、联合索引最左匹配1、什么时候用联合索引2、什么是覆盖索引 四、索引条件下推(ICP) 一、索引失效的场景 MySQL索引失效的场景,什么情况下会造成MySQL索引失效 二、列的离散度 什么是列的离散…

【Nacos】实战之配置中心加载多个配置文件

目录 复习未拆分前的yaml文件拆分配置文件dataSource.yamlmybatis.yamlother.yaml 微服务同时加载多个远程配置文件修改配置文件 复习 导入依赖在子模块里面创建 bootstrap.yaml 文件bootstrap.yaml 文件 添加需要的远程配置信息开始拆分以前的配置信息 未拆分前的yaml文件 拆…

服务器数据库被360后缀勒索病毒攻击怎么解决,勒索病毒解密

随着网络攻击日益猖獗,数据库遭遇勒索病毒的攻击已成为常见现象。而360后缀勒索病毒是一种恶意软件,它将加密数据库中的文件,并要求受害者支付赎金才能获得解密密钥。近日,我们收到很多企业的求助,企业的服务器被360后…

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器

文章目录 前言1. 电路原理图理解1.1 LED与KEY原理图理解1.2 BEEP蜂鸣器 2. 外部中断配置阐述3. STM32CubeMX配置4. 代码编写4.1 代码编写思路4.2 重写回调函数 TIPS总结 前言 这篇文章详细记录外部中断方式控制LED的亮灭以及蜂鸣器的开关;本文从原理图开始到最后实…

工作日记20230714

1、报文id定义对,类库中和tracking中的报文长度定义一致,但是和一级那边的报文长度定义不一致,对方有可能会收到报文,但是发送方在发出数据后程序会自动中止。 2、结构体 如果定义结构体List的话,不用在()加初始值&a…

分享一下使用finalshell连接虚拟机失败的经历

今天在使用finalshell连接安装的Ubuntu的时候遇到了一点问题,通过root用户连接的时候一直连接失败。 然后照着网上的解决方式一个个试 一、安装oppenssh -server sudo apt-get install openssh-server 然后重启ssh sudo service ssh restart 二、设置密码 最后发…

【架构设计】谈谈防腐层的妙用

文章目录 前言一、一个简单的例子二、防腐层介绍总结 前言 最近在学习了解领域驱动模型DDD相关的内容,但是由于没有实际的项目支撑,所以大都是停留在一些理论层面。我发现这里面的一些设计思想还是非常有实用价值的,可以直接应用于你目前的项…

基于ssm+mybatis+mysql+jsp机票预定系统

基于ssmmybatismysqljsp机票预定系统 一、系统介绍二、功能展示1.主页2.个人中心3.用户管理(管理员)4.客机管理(管理员)5.航班管理(管理员)6.机票管理(管理员) 三、其它系统四、获取源码 一、系统介绍 系统…

nacos设置服务权重

nacos设置服务权重

飞行动力学 - 第8节-着陆性能 之 基础点摘要

飞行动力学 - 第8节-着陆性能 之 基础点摘要 1. 着陆性能1.1 空中直线段S11.2 拉平段S21.3 地面滑跑段S3 2. 着陆性能改善方法3. 起飞性能列举4. 参考资料 1. 着陆性能 总体距离S S1 S2 S3,越短性能越佳。 1.1 空中直线段S1 1.2 拉平段S2 1.3 地面滑跑段S3 2. 着…

三分钟了解Redis HyperLogLog 数据结构

文章目录 0. 前言1. 原理1.2 原理解析 2.实战案例3. Redis从入门到精通系列文章4. 常见问题4.1. 什么是Redis HyperLogLog?4.2. HyperLogLog算法的核心思想是什么?4.3. HyperLogLog算法的误差率如何控制?4.4. HyperLogLog算法的存储空间大小与…

超图数据集概念学习1

以前写过一些数据源数据集有关的博文;从头学习一下; 数据集是同种类型数据的集合,比如:点数据集、线数据集。根据数据类型的不同,分为矢量数据集、格网数据集和影像数据集,以及为了处理特定问题而设计的如路…

​CentOS防火墙操作命令 ​

CentOS防火墙操作命令 1、查看防火墙服务状态 systemctl status firewalld.service 或者查看防火墙的状态: 1 firewall-cmd --state 2、开启、重启防火墙 启动firewall: 1 systemctl start firewalld.service 设置开机自启或禁用: …

【Ceph】基于ceph-deploy部署Ceph集群详解

基于ceph-deploy部署Ceph集群详解 1. 存储基础1.1 单机存储设备1.1.1 单机存储的问题1.1.2 商业存储解决方案 1.2 分布式存储(软件定义的存储SDS)1.2.1 分布式存储的类型 2. Ceph简介2.1 Ceph优势2.2 Ceph架构2.2.1 高层应用接口 2.3 Ceph核心组件2.3.1 …

CTFShow-WEB入门篇文件上传详细Wp(151-170)

WEB入门篇--命令执行详细Wp 文件上传:Web151:Web152:Web153:Web154:Web155:Web156:Web157:Web158:Web159:Web160:Web161:Web162&#…

Java:基本数据类型 和 所占大小

目录 java基本程序结构命名注释数据类型 和 大小整数类型浮点char编码boolean 变量常量final 的作用 java基本程序结构 命名 小驼峰:第一个单词小写,后面的单词大写。 大驼峰:每个单词都大写。 变量,方法:小驼峰。 j…