MySQL - 第4节 - MySQL数据类型

news2024/9/28 21:24:08

目录

1.数据类型的作用

2.数据类型分类

3.数值类型

3.1.tinyint类型

3.2.bit类型

3.3.float类型

3.4.decimal类型

4.字符串类型

4.1.char类型

4.2.varchar类型

4.3.char和varchar比较

5.时间日期类型

6.enum和set类型

6.1.enum和set类型

6.2.调查表案例

6.3.通过数字设置enum

6.4.通过数字设置set

6.5.enum和set查找


1.数据类型的作用

数据类型的作用:

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

• 决定了如何识别一个特定的二进制序列。

• 决定了数据的取值范围。


2.数据类型分类

注:MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)只有1和0两种取值,可以分别对应bool类型的true和false。


3.数值类型

3.1.tinyint类型

有符号tinyint范围测试:

创建一个表,表当中包含一个tinyint类型的列,默认其为有符号类型。如下:

由于tinyint类型占用1字节,因此有符号tinyint的取值范围为-128~127,插入该范围内的数据时都能成功插入。如下:

如果插入的数据不在-128~127范围内,那么插入数据时就会产生报错。如下:

注:

1.c语言中,如果将200赋值给char类型的变量a,编译器会告警,然后将200的二进制补码截断并赋值给变量a。在mysql中,如果将200赋值给tinyint类型的变量a,编译器会直接报错。

在mysql中,如果插入的数据不符合要求,mysql会直接终止操作。因为mysql本身就是存储数据的,如果允许自由截断,那么mysql中的数据可信度就不高了。

2.在mysql中,数据类型符合条件就允许操作,数据类型不符合条件就不允许操作,这样就倒逼程序员,约束程序员必须遵守规则,因此数据类型本质就是一种约束。

无符号tinyint范围测试:

创建一个表,表当中包含一个tinyint类型的列,并指定其为无符号类型。如下:

由于tinyint类型占用1字节,因此无符号tinyint的取值范围为0~255,插入该范围的数据时都能成功插入。如下:

如果插入的数据不在0~255范围内,那么插入数据时就会产生报错。如下:

建议:除非场景要求数值类型必须是无符号,否则尽量不要使用无符号,因为有符号的数值类型存不下的数据,其对应的无符号类型同样可能存不下,这时应该直接将数值类型进行提升。

3.2.bit类型

bit类型的显示方式:

创建一个表,表当中包含一个int类型的id列和一个8位bit类型的a列。如下:

向表中插入一条记录,记录中指定id和a的值均为10,插入记录后查看表会发现a的值显示的并不是10。如下:

根本原因是因为bit类型在显示时,是按照ASCII码对应的值进行显示的,而在ASCII码表中10对应的是控制字符LF,表示换行的意思。如果向表中插入记录时指定id和a的值均为65,由于ASCII码表中65对应的是字符A,因此插入记录后查看表就会发现a的值显示的是A。如下:

bit类型的范围测试:

创建一个表,表当中包含用户名name和用户性别gender,其中gender的类型可以指定为1位bit类型,因为性别只有男和女两种取值,使用1个比特位来表示用户的性别就可以节省空间。如下:

如果规定gender列插入0表示男,插入1表示女,那么在插入用户信息时就可以通过插入0和1来指定用户的性别。如下:

如果插入gender列的数据不是0或1,那么插入数据时就会产生报错。如下:

建议:

• 虽然MySQL提供了位类型bit,但一般不建议将数据类型设置成位类型,除非将来这个数据本身就只是给程序看的,并且数据本身非常占用资源。

• 因为查询位类型数据时,默认会按照ASCII码对应的值进行显示,这对于将来数据库管理员维护数据库或程序员调试程序都是不太方便的。

3.3.float类型

有符号float范围测试:

创建一个表,表当中包含一个float(4,2)类型的列,默认其为有符号类型。如下:

由于float(4,2)的取值范围为-99.99~99.99,因此插入该范围内的数据都能成功插入。如下:

此外,由于MySQL在保存值时会进行四舍五入,因此实际可插入float(4,2)的范围为-99.994~99.994,如果插入的数据不在该范围内,那么插入数据时就会产生报错。如下:

无符号float范围测试:

创建一个表,表当中包含一个float(4,2)类型的列,并指定其为无符号类型。如下:

无符号float类型的取值范围,实际就是把对应有符号float类型中的负数部分拿走了,因此float(4,2)的取值范围为0~99.99,实际可插入的范围是0~99.994。如下:

如果插入的数据不在0~99.994范围内,那么插入数据时就会产生报错。如下:

3.4.decimal类型

decimal和float类型的使用方式一样,但decimal的精度比float更高。

创建一个表,表当中分别包含一个float(10,8)的列和一个decimal(10,8)的列。如下:

向表当中插入一条记录,指定float和decimal的值均为23.12345612,但最终查表时会发现decimal保持了数据的原貌,而float则会存在一定的精度损失。如下:

说明:

• float表示的精度大约是7位。

• decimal整数最大位数m为65,支持小数最大位数d是30。如果d被省略,默认为0,如果m被省略,默认为10。

• 如果希望小数的精度高,推荐使用decimal。


4.字符串类型

4.1.char类型

创建一个表,表当中包含一个char(6)的content列。如下:

由于char(6)中最多可存储6个字符,因此只要插入的字符个数不超过6个都是能够成功插入的。如下:

如果插入的字符个数超过了6个,那么在插入数据时就会产生报错。如下:

需要注意的是,这里所说的字符并不只是指一个英文字母,一个汉字也是一个字符,因此只要插入的汉字个数不超过6个也是可以插入的。如下:

好处:

• 在不同编码中,一个字符所占的字节个数是不同的,比如utf8中一个字符占3个字节,而gbk中一个字符占2个字节。MySQL限定字符的概念不是字节,这样用户就不用关心复杂的编码细节了。

4.2.varchar类型

创建一个表,表当中包含一个varchar(6)的content列。如下:

由于varchar(6)中最多可存储6个字符,因此只要插入的字符个数不超过6都是能够成功插入的。如下:

如果插入的字符个数超过了6个,那么在插入数据时就会产生报错。如下:

注:一个字符串的长度有上限和其是变长的并不直接冲突。varchar的L参数代表该可变长字符串的最大长度,如果该字符串长度没有超过最大长度L,则字符串要占用多少空间就分配多少空间。

varchar类型可指定的字符个数上限:

varchar类型最多占用65535字节,其中有1~2字节用来表示实际数据长度,还有1字节来存储其他控制信息,因此varchar类型的有效字节数最多是65532字节。

而varchar类型可指定的字符个数上限,与表的编码格式有关:

• 对于utf8编码来说,一个字符占用三个字节,因此varchar(L)中的L最大可指定为 65532 \div 3 = 21844。
• 对于gbk编码来说,一个字符占用两个字节,因此varchar(L)中的L最大可指定为 65532 \div 2 = 32766。
因此在定义编码格式为utf8的表时,varchar(L)中的L如果超过了21844,则会产生报错。如下:

而在定义编码格式为gbk的表时,varchar(L)中的L如果超过了32766,则会产生报错。如下:

4.3.char和varchar比较

char和varchar比较:

char和varchar的区别如下:

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

char和varchar的优缺点如下:

• char类型的数据是定长的,因此磁盘空间比较浪费,但是效率高(直接访问定长的空间)。
• varchar类型的数据是变长的,因此磁盘空间比较节省,但是效率低(需要先读取存储字符串的长度,再访问指定长度的空间)。

如何选取char和varchar类型:

如果要存储的数据是定长的,那就使用char类型进行存储,比如身份证号码、手机号、md5等。如果要存储的数据是变长的,那就使用varchar类型进行存储,比如名字、地址等。


5.时间日期类型

三种时间日期类型:

常用的三种时间日期类型如下:

• date:日期格式为YYYY-MM-DD,占用三字节。
• datetime:时间日期格式为YYYY-MM-DD HH:MM:SS,占用八字节。
• timestamp:时间戳,格式为YYYY-MM-DD HH:MM:SS,占用四字节。
创建一个表,表当中包含date、datetime和timestamp三种时间日期类型的列。如下:

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

因此如果插入数据时不插入t3列,那么就会自动插入当前的时间戳。如下

timestamp类型使用案例:

创建一个评论表,表当中包含评论人的昵称、评论的内容和评论的发布时间。如下:

向评论表中插入记录时,只需要指明评论人的昵称和评论的内容,评论的发布时间默认会设置成该记录的插入时间。如下:

如果评论人修改了评论内容,那么就需要对评论表进行更新,更新表的同时评论的发布时间也会更新为修改表的时间。如下:


6.enum和set类型

6.1.enum和set类型

enum和set类型的区别如下:

• 在定义enum字段时需要提供若干个选项的值,在设置enum字段值时只允许选取其中的一个值。
• 在定义set字段时需要提供若干个选项的值,在设置set字段值时可以选取其中的一个或多个值。
比如人的性别只能从男和女中进行二选一,因此可以定义成enum类型,而人的爱好在提供的选项中可能存在多个,因此可以定义成set类型。

6.2.调查表案例

创建一个调查表,表当中包含被调查人的姓名、性别和爱好。如下:

向表中插入记录时,被调查人的性别只能从男和女中进行二选一,被调查人的爱好可以从提供的若干个选项中进行多选一或多选多,多个爱好之间需要通过英文逗号隔开。如下:

6.3.通过数字设置enum

通过数字设置enum:

在插入记录时,除了通过指明男女来设置性别,还可以通过插入数字1和2来设置性别。如下:

根本原因在于,MySQL出于效率考虑,在存储enum值时实际存储的都是数字,enum中提供的选项值依次对应数字1、2、3、…,最多65535个,因此在设置enum值时可以通过数字的方式进行设置。

6.4.通过数字设置set

通过数字设置set:

在插入记录时,除了通过指明多个选项来设置爱好,还可以通过数字的方式来设置。如下:

因为MySQL存储set值时实际存储的也是数字,set中提供的选项值依次对应数字1、2、4、8、…,最多64个(位图,对应不同的比特位),因此在设置set值时可以通过数字的方式进行设置。

建议:虽然enum和set可以通过数字的方式进行设置,但严重不推荐这种做法,因为这样的SQL可读性太差,导致后期维护成本变高。

6.5.enum和set查找

如果想要筛选出调查表中所有女同志的信息,那么直接在筛选时指明gender='女'即可,因为enum类型的值只能多选一。如下:

但如果要筛选出调查表中爱好包含敲代码的人的信息就比较麻烦了,如果继续使用上述方式,那么最终筛选出来的是爱好仅为敲代码的人的信息。如下:

这时需要借助find_in_set(str,strlist)函数,该函数的作用是查询strlist中是否包含str,如果包含则返回str在strlist中的位置(从1开始),否则返回0。

通过select可以对find_in_set函数进行验证,依次查找集合a,b,c中是否包含字符a、b、d,这时在查找字符a和b时就会得到其在集合中的下标,而在查找字符d时就会得到0值。如下:

这时就可以通过select搭配find_in_set函数,来筛选出爱好包含敲代码的人的信息了。如下:

此外,我们还可以继续添加筛选条件,比如筛选出爱好中包含敲代码,但爱好又不仅仅是敲代码的人的信息。如下:

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

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

相关文章

二手车交易APP开发功能有哪些?

二手车交易APP开发功能有哪些? 1、车辆估价:在选购二手车时,了解车辆的市场价值是非常重要的。为了保证客户能够准确估计车辆的价值,二手车APP软件开发应该具备车辆估价功能。用户可以通过APP输入车辆的基本信息&#xff0…

离线(内网)主机创建python项目运行环境

一、创建requirements.txt文件 文件中是python项目需要的依赖和版本号 二、把依赖下载到本地 准备一个能联网的pc,把依赖下载到本地 pip download -d ./venv -r requirements.txt -i https://pypi.mirrors.ustc.edu.cn/simple/这个命令会把依赖下载到venv文件夹…

指数全线收跌,上证跌破3200点,仅4137只个股下跌!

如题,端午假期前一天,A股指数全线收跌,上证指数跌破3200点,仅4137只个股下跌!就问你服不服? 不要急,不要慌,我们来细细分析。 过去一两周,上证指数以震荡为主&#xff…

嵌入式Linux学习入门

大四毕业了,签了一份嵌入式开发的工作,现在准备入门了,搜集一些要学习的内容。 嵌入式开发学习路线 51单片机,arm,stm32在单片机上 在单片机上编程c语言和在嵌入式系统写c语言,有很大不同 gcc又与我们普…

与反恐、反间谍科同级,美国国家安全部设立网络安全科

美国国家安全部(NSD)成立了一个新的网络部门,旨在能够更有力地应对高技术性的网络威胁。 这个新成立的部门,正式名称为国家网络安全科,是为了响应美国司法部 (DoJ) 2022 年全面网络审查中的核心…

导致JVM内存泄露的ThreadLocal详解

很常见的关于ThreadLocal的面试题的问法: 1.说说你对ThreadLocal的理解。 2.ThreadLocal 是什么?有哪 些使用场景?什么是线程局部变量? 3.ThreadLocal内存泄漏分析与解决方案。 ps:想理解好ThreadLocal,必须先得理…

Spring Boot命令行启动添加参数

一、Spring Boot命令行三种参数形式 通过java -jar启动springboot的jar项目时,可以动态传递参数来进行配置和开发,比如 java -jar xxx.jar --server.port8081 可以通过server.port修改项目启动的端口,通过命令行传递的参数具有更高的优先级…

华为OD机试 JavaScript 实现【最优策略组合下的总的系统消耗资源数】【牛客练习题】,附详细解题思路

一、题目描述 在通信系统中有一个常见的问题是对用户进行不同策略的调度,会得到不同系统消耗的性能。 假设由N个待串行用户,每个用户可以使用A/B/C三种不同的调度策略,不同的策略会消耗不同的系统资源。 请你根据如下规则进行用户调度&…

【Java-SpringBoot+Vue+MySql】Day3.2-RESTful风格

目录 一、RESTful风格介绍 1、知识轰炸 2、代码演练 (1)测试get接口 (2)测试Post接口 (3)测试Put接口 (4)测试delete接口 二、Swagger介绍 1、知识轰炸 2、实操演练 &#x…

Android修行手册-多路USB外接摄像头

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

CSS3-盒子模型

盒子模型的介绍 盒子概念 盒子组成 盒子内减 拓展 1. 盒子的概念 1 页面中的每一个标签,都可看做是一个 “盒子”,通过盒子的视角更方便的进行布局 2 浏览器在渲染(显示)网页时,会将网页中的元素看做是一个个的矩形区域…

Selenium详解

Selenium 环境配置好之后,我们就可以使用 Selenium 来操作浏览器,做一些我们想做的事情了。在我们爬取网页过程中,经常发现我们想要获得的数据并不能简单的通过解析 HTML 代码获取,这些数据是通过 AJAX 异步加载方式或经过 JS 渲染…

Python高级系列教程:Python闭包和装饰器

今天我们将继续讲解 Python 中的闭包和装饰器。虽然我们还没有详细学习这两个概念,但在面向对象编程中,我们已经经常使用装饰器了。装饰器可以给函数增加额外的功能,就像语法糖一样甜。在 Python 中,装饰器的格式通常是在函数上方…

三分钟学习一个python小知识1-----------我的对python的基本语法的理解

文章目录 一、变量定义二、数据类型三、条件语句四、循环语句五、函数定义总结 一、变量定义 在Python中,使用等号()进行变量的定义,并不需要声明变量的类型,Python会自动根据赋值的数据类型来判断变量的类型&#xf…

算法篇——动态规划 完全和多重背包问题 (js版)

一些分析总结 01 背包 问题和 完全背包 问题的不同点在于,所有的物品只能使用一次,判断 哪些物品 装进背包里 物品价值和 最大;而 完全背包 问题中,所有物品都能使用n次,判断 哪个物品 装 n 个进去 物品价值和 最大。…

Mybatis源码分析_日志模块 (1)

不得不承认,学习MyBatis的时间成本要比学习Spring低很多,Mybatis是我所了解过的代码量最小、整体架构最简单,但是又是最具有学习价值的一个框架。如果,你想快速的阅读一个框架的源码,并且掌握这个框架的精髓&#xff0…

浅析GeoServer CVE-2023-25157 SQL注入

简介 GeoServer是一个开源的地图服务器&#xff0c;它是遵循OpenGIS Web服务器规范的J2EE实现&#xff0c;通过它可以方便的将地图数据发布为地图服务&#xff0c;实现地理空间数据在用户之间的共享。 影响版本 geoserver<2.18.7 2.19.0<geoserver<2.19.7 2.20.0…

国内外八大敏捷开发工具盘点

1、Leangoo领歌&#xff1b;官网&#xff1a;Leangoo领歌 - 高效企业必备的敏捷工具,Scrum工具,SAFe敏捷工具,敏捷项目管理,敏捷研发工具 2、VersionOne&#xff1b;官网&#xff1a;https://www.collab.net/products/versiononehttps://www.collab.net/products/versionone …

Python高级系列教程:Python高级语法与正则表达式

学习目标 1、能够掌握with语句的使用 2、能够知道生成器的两种创建方式 3、能够知道深拷贝和浅拷贝的区别 4、能够掌握Python中的正则表达式编写 一、Python高级语法 1、with语句和上下文管理器 ☆ with语句 Python提供了 with 语句的写法&#xff0c;既简单又安全。文件操…

Vue-scoped(局部)样式

scoped(局部)样式 scoped是在脚手架有一个编写样式的小技巧 作用&#xff1a;让样式在局部生效&#xff0c;防止冲突 1 编写案例 现在有两个组件&#xff0c;一个student,一个school&#xff0c;现在想给组件写点样式 这里只给个背景色 没问题&#xff0c;样式生效 2 样式冲…