MySQL数据类型

文章目录

  • 一、数据类型分类
  • 二、数值类型
    • 1.tinyint类型
    • 2.bit类型
    • 3.float类型
    • 4.decimal类型
  • 三、字符串类型
    • 1.char类型
    • 2.varchar类型
  • 四、日期和时间类型
  • 五、enum类型和set类型
    • 1.enum类型
    • 2.set类型

一、数据类型分类

MySQL的数据类型一共有如下几类,表格中简单介绍了各种数据类型以及说明:

在这里插入图片描述

二、数值类型

我们会发现上表中数值类型光是整型就分出了很多类,比高级语言的分类还要多。MySQL将数值类型划分得如此细粒度,原因是尽量避免空间的浪费。

1.tinyint类型

tinyint类型是小整数类型,它可以指定是有符号的还是无符号的,如果是有符号的那么取值范围是-128 ~ 127,如果是无符号的那么取值范围是0 ~ 255。默认是有符号的。

我们创建一个表,表中设置age字段,字段类型设置为tinyint无符号类型,创建好之后查看一下这个表:

在这里插入图片描述

2.bit类型

bit是位字段类型,在定义的时候bit后面可以带圆括号,括号里填位数,表示该字段能表示几个比特位,范围是1 ~ 64,也可以忽略,默认位数为1。

我们创建一张表使用一下bit类型:

在这里插入图片描述

我们向表中插入几个数据,看一下bit类型的使用,首先id插入10,a也插入10,再向id插入65,a也插入65,查看表的内容:

在这里插入图片描述

最后我们发现id列显示是正常的,但a列显示似乎有点不正常。其实这并不是a列显示不正常,只是MySQL在读取a列数据的时候按照ASCII码来读取,我们插入到a列的10和65都被转换成了ASCII对应的值。

3.float类型

float类型是小数类型,它也可以指定是有符号的还是无符号的,在定义float字段时要指定长度和小数位数,其定义语法为:

float [(m,d)] [unsigned]

其中m代表显示长度,即整数部分加小数部分一共有多少位,d代表小数位数。我们可以演示一下创建一张表定义一个float类型的字段,例如定义salary字段代表薪资,类型为float,显示长度设置为4,小数位数设置为2:

在这里插入图片描述

接下来我们向salary字段中插入一些数据来验证一下,首先插入salary为99.99,插入成功;再插入99.999,插入失败,原因是小数位数和长度都不符合;插入-99.99,插入成功;插入-99.999,插入失败:

在这里插入图片描述

如果我们salary插入99.995,还是插入失败,但是如果插入99.994,插入99.993,插入99.992,都能插入成功,但是一查看表中的数据内容时发现,最后真正插入进来的全都是99.99:

在这里插入图片描述

原因是MySQL在保存值的时候会进行四舍五入,如果四舍五入后的结果能符合一开始设定的长度,那么就可以成功插入。

4.decimal类型

decimal类型也是小数类型,它的使用方法和float基本一致,基本语法如下:

decimal (m, d) [unsigned]

其中m代表指定长度,d代表小数点位数,在使用上甚至说在绝大部分情况下decimal类型和float类型都没什么区别。但如果我们同时插入23.12345612这个数到float类型字段和decimal类型字段,就可以看出它们的区别:

在这里插入图片描述

我们可以发现float字段插入的时候出现了精度损失,所以这就是float和decimal的区别,decimal的精度比float更高,float表示的精度大约是7位,decimal中m的最大值是65,支持的小数位数d的最大值是30。如果decimal的d被省略,默认为0,如果m被省略,默认为10。所以如果使用高精度场景尽量使用decimal。

三、字符串类型

1.char类型

char类型是固定长度的字符串,其基本语法如下:

char (L)

其中L表示可以存储的长度,单位是字符,不是字节,char类型的最大长度值可以为255。MySQL的char类型和C/C++的char类型是不一样的,MySQL中的char类型是以字符为单位的字符串类型。

我们创建一张表演示一下char类型的使用,定义一个char类型字段,长度设置为2,代表最大长度为2个字符,我们向其插入“a”,插入成功;插入“ab”也插入成功;插入“abc”就插入失败了,原因是不满足长度要求。插入“张三”也可以插入成功;插入“王老五”就插入失败了,原因是不满足长度要求:

在这里插入图片描述

2.varchar类型

varchar类型也是字符串类型,它是可变长字符串,基本语法如下:

varchar(L)

其中L表示字符串的最大长度,单位也是字符,最大长度可以达到65535个字节。我们可以演示一下varchar的使用,与上面的char类型测试保持一致,最大长度设置为2。首先插入“a”,可以插入成功;然后插入“ab”也可以插入成功;插入“abc”就插入失败了,原因是不满足长度要求。插入“张三”也可以插入成功;插入“王老五”就插入失败了,原因也是不满足长度要求:

在这里插入图片描述

从这里看来,varchar和char没有任何区别,为什么要多一个varchar类型呢?为什么varchar类型又叫做可变长字符串呢?

其实,varchar的可变长并不是指它的上限可变长,如果字符串的长度超过了varchar规定的长度上限,同样是不能插入的。这里的可变长指的是空间的可变长。

varchar的长度可以指定为0 ~ 65536之间的值,但是有1 ~ 3个字节是用来记录数据大小的,所以说有效的字符串所占字节数最大是65532。那么char类型和varchar类型有什么区别呢?下面的表格就可以很好地诠释两者之间的区别:

实际存储char(4)varchar(4)char占用字节varchar占用字节
abcdabcdabcd4*3=124*3+1=13
AAA4*3=121*3+1=4
abcde××数据超过长度数据超过长度

从上面的表格我们可以看出,同样是设置了最大长度是4的char类型和varchar类型,当插入的值是“abcd”四个字符时,char类型占用的字节是12个,varchar类型占用的字节是13个,原因是varchar需要多一个字节来记录数据的大小。但是如果插入的值是“A”,char类型占用的字节依旧是12个,原因是char类型是定长的,这里的定长指的是空间定长,在被定义的时候char类型就开辟好了那么大的空间,就算没有使用完也是要占那么大的空间。但varchar类型就不一样了,此时varchar类型占用的字节是4个,原因是varchar类型是可变长的,这里也指的是空间,varchar类型不会在一开始固定空间大小,而是需要多少空间就给多少空间,所以这就是char类型和varchar类型的区别。

如何选择char类型和varchar类型:

  • 如果可以确定数据的长度都是一样的,那就使用char类型,比如身份证、手机号等。
  • 如果数据长度是有变化的,那就使用varchar类型,比如名字、地址等。但是需要保证最长的数据也能存储进去。
  • char类型比较浪费磁盘空间,但是效率比较高。
  • varchar类型比较节省磁盘空间,但是效率比较低。

总之,char类型的意义是直接开辟好对应的空间,varchar类型的意义是在不超过自定义长度的情况下,需要使用多少空间就开辟多少空间。

四、日期和时间类型

MySQL有三个日期和时间类型:

  • date:日期类型,只能用来表示日期,格式为year-month-day,占用3个字节。
  • datetime:日期时间类型,可以用来表示日期和时间,格式为year-month-day hour:minute:second,表示范围从1000 ~ 9999,占用8个字节。
  • timestamp:时间戳类型,表示从1970-01-01 00:00:00开始到现在的秒数,该类型的显示格式和datetime完全一致,占用4个字节。

下面我们创建一张表演示一下三种日期和时间类型的使用:

在这里插入图片描述

五、enum类型和set类型

1.enum类型

enum类型是枚举类型,它是用来提供可选择的选项的,并且是单选类型,基本语法如下:

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

在设定enum类型字段的时候需要将所有可以被选择的选项枚举出来,最终插入数据的时候,enum类型只能选择一个选项,因为enum类型是单选类型。出于效率的考虑,这些选项值实际存储的是数字,这些选项值在底层其实依次对应1 ~ 65535的数字。所以在我们添加枚举值时,也可以添加对应的数字编号。

我们可以建一个表演示一下enum类型的使用,添加一个名为sex的字段,字段类型为enum,可供选择的选项只有“男”和“女”,然后我们向表中插入数据:

在这里插入图片描述

如果我们想查询表格中性别为男的所有人,输入语句select * from t8 where sex='男';,即可查询出结果:

在这里插入图片描述

2.set类型

set类型是集合类型,它也是用来提供选项的,只不过它是用来提供多选的,基本语法如下:

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

set类型在定义的时候需要将所有可供选择的选项都枚举出来,在插入数据的时候可以选择任意多个选项。而且出于效率考虑,这些选项值其实在底层也是数字,它在底层是位图结构,最多有64位。比如第一个选项就代表第一个比特位,以此类推。

我们也可以建一个表演示一下set类型的使用,添加一个名为hobby的字段,字段类型为set,可供选择的选项分别有:“游泳”、“唱歌”、“跳舞”、“rap”、“篮球”、“足球”,然后我们向表中插入数据:

在这里插入图片描述

在这里插入图片描述

如果我们想查询爱好是篮球的所有人,输入语句select * from t9 where hobby='篮球';,查出来的结果发现并不符合要求,它只给我们查出来了只喜欢打篮球的人,有一些既喜欢打篮球又喜欢唱跳rap的人并没有被查出来:

在这里插入图片描述
所以set的查询需要使用到复合查询函数find_in_set,函数基本使用如下:
如果sub在str_list中,则返回对应的下标,如果不在,则返回0。str_list是用逗号分隔开的字符串。

find_in_set(sub, str_list);

例如我们现在想在刚才的表格中查找喜欢篮球的所有人,输入语句select * from t9 where find_in_set('篮球', hobby);

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业级API网关之典型应用场景

目 录 01 企业面对API与网关的现状‍‍‍‍‍ 02 APIGW介绍及企业应用场景 03 总结 01 企业面对API与网关的现状‍ 在企业中,进行新的系统/应用/产品开发时,具有周密的流程:从需求分析、设计、开发、测试、发布与验收。所以,一…

bmp转jpg怎么转?bmp转换jpg的几个方法

bmp转换jpg的几个方法~什么是BMP呢?BMP是位图文件格式的一种,全称为Bitmap(位图),是一种基于像素的图像文件格式。BMP是Windows操作系统中最常用的图像格式之一,通常以.bmp或.dib作为文件扩展名。BMP文件格…

华芯微特SWM34-IO速度优化

对比测试了一下IO翻转速度在各种函数调用的情况下的差异 CPU运行速度150Mhz,SDRAM开 直接调用翻转函数 while(1) {GPIO_InvBit(GPIOA, PIN0); }速度大约5Mhz,主要是因为函数调用开销和函数内部的移位和异或操作,增加了指令的运行数量。 vo…

Rust每日一练(Leetday0012) 首末位置、插入位置、有效数独

目录 34. 查找元素的首末位置 Find-first-and-last-position-of-element-in-sorted-array 🌟🌟 35. 搜索插入位置 Search Insert Position 🌟 36. 有效的数独 Valid Sudoku 🌟🌟 🌟 每日一练刷题专栏…

Atcoder beginner contest 302

A - Attack AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> #define int long long using namespace std; signed main() {int a, b;cin >> a >> b;if (a % b 0) cout << a / b << endl;else c…

加密与解密 调试篇 动态调试技术 (二)

目录 常见的断点 1.INT 3 断点 检测 绕过 2.硬件断点 原理 我们给出硬件中断的例子 删除硬件断点 3.内存断点 原理 例子 删除 区别 总结 4.内存访问一次性断点 5.消息断点 例子 删除 6.条件断点 &#xff08;1&#xff09;按寄存器条件中断 &#xff08;2&…

【JDK】一、jdk17的下载与安装配置(图文说明超详细)

JDK17的下载与安装 前言一、JDK17下载1、官方下载地址 &#xff08; Oracle中国的官方网站&#xff09; 二、JDK17安装1、先看一下我现在的java版本和环境变量2、开始新的安装第一步&#xff1a;双击下载的jdk-17.0.7_windows-x64_bin.exe 进入到安装页面第二步&#xff1a;jdk…

sqlmap命令大全(附详细扫描流程)

一、sqlmap命令大全。 -u 指定目标URL (可以是http协议也可以是https协议)-d 连接数据库--dbs 列出所有的数据库--current-db 列出当前数据库--tables 列出当前的表--columns 列出当前的列-D 选择使用哪个数据库-T 选择使用哪个表-C 选择使用哪个列--dump 获取字段中的数据--…

破解mysql用户的密码

假如mysql数据库中有一个 prod_blb 用户&#xff0c;你作为root管理员&#xff0c;想知道它的密码&#xff0c;又不想修改它的密码。这个时候就只能通过获取到 prod_blb 用户加密的密码进程破译 1、MYSQL加密方式 MYSQL数据库的认证密码有两种方式&#xff0c;MYSQL 4.1版本之…

《Spring Guides系列学习》guide6 - guide10

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

【源码解析】流控框架Sentinel源码深度解析

前言 前面写了一篇Sentinel的源码解析&#xff0c;主要侧重点在于Sentinel流程的运转原理。流控框架Sentinel源码解析&#xff0c;侧重点在整个流程。该篇文章将对里面的细节做深入剖析。 统计数据 StatisticSlot用来统计节点访问次数 SpiOrder(-7000) public class Statis…

跨时钟域数据同步

跨时钟信号直接传输在信号跳变时违背本地时钟域的时序要求&#xff08;建立时间约束&#xff0c;保持时间约束&#xff09;&#xff0c;容易产生亚稳态&#xff0c;无法确定亚稳态何时结束以及结束时保持在何种状态上。 用同步器抑制亚稳态的往下传播的概率&#xff0c;根据情…

H3C IPSec IKE野蛮模式

这里使用H3C模拟器。 H3C IPSec IKE野蛮模式&#xff0c;又称为IKE Main Mode&#xff0c;主要是在第一阶段&#xff08;Phase 1&#xff09;的过程中提供身份保护。它主要用于VPN隧道建立过程中的密钥交换。以下是配置步骤&#xff1a; 创建IKE提案&#xff1a; system-view…

QT圆形进度条(QT桌面项目光照强度检测)

文章目录 前言一、编程思路二、核心代码实现总结 前言 本篇文章我们讲解QT实现圆形进度条&#xff0c;并实现动态的效果。 一、编程思路 实现QT圆形进度条其实是非常简单的&#xff0c;思路就是画两个圆弧。 这里大家就会觉得很奇怪了为什么画两个圆弧就能实现圆形进度条了呢…

轻NAS搭建 - 使用微力同步搭建私人云盘,无需公网IP也能远程访问

文章目录 1.前言2. 微力同步网站搭建2.1 微力同步下载和安装2.2 微力同步网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 私有云盘作为云存储概念的延伸&#xff0c;虽然谈不上多么新颖&#xff0c;但是其…

华为OD机试之不含101的整数(Java源码)

不含101的数 题目描述 小明在学习二进制时&#xff0c;发现了一类不含 101的数&#xff0c;也就是&#xff1a; 将数字用二进制表示&#xff0c;不能出现 101 。 现在给定一个整数区间 [l,r] &#xff0c;请问这个区间包含了多少个二进制不含 101 的整数&#xff1f; 输入描述…

2023全球最佳医院榜单及简要介绍

作为医学类的访问学者、博士后及联合培养博士们&#xff0c;都希望到世界知名医院进行临床研修交流及科研学习。2023 年世界最佳医院排行榜的发布为申请者提供了目标平台&#xff0c;现知识人网小编整理刊出。 近期&#xff0c;《新闻周刊》和全球数据公司 Statista 推出了2023…

Vue之MVVM模型

文章目录 前言一、简说MVVM模型二、走进MVVM总结 前言 Vue的创建者在创建Vue时没有完全遵守MVVM&#xff08;一种软件架构模式&#xff09;&#xff0c;但是Vue的设计受到了他它的启发。这也是为什么经常用vm&#xff08;ViewModel的缩写&#xff09;这个变量名表示Vue实例。 …

操作系统第三章——内存管理(中)

九月重楼二两&#xff0c;冬至蝉蜕一钱&#xff0c;煎入隔年雪煮沸&#xff0c;可治人间相思苦疾&#xff0c; 可是&#xff0c;重楼七叶一花&#xff0c;冬日何来蝉蜕&#xff0c;原是相思无解 殊不知 夏枯即为九叶重楼&#xff0c;掘地三尺寒蝉现&#xff0c;除夕子时雪&…

non-protected broadcast场景分析及解决

non-protected broadcast场景分析及解决 在两个app之间互相送消息使用BroadcastReceiver&#xff0c;有时在运行过程中在logcat工具中会发现大片的飘红消息。 要消除这些错误信息&#xff0c;需要在广播的 Sender 和 Receiver 做部分的修改。 错误信息分析 由于 发送端 的 M…