【MySQL】MySQL的数据类型

MySQL的数据类型

  • 一、数据类型分类
  • 二、数值类型
    • 1、整数类型
    • 2、bit类型
    • 3、小数类型
  • 三、字符串类型
  • 四、时间日期类型
  • 五、enum和set类型
    • enum和set查找

数据类型的作用:

  • 决定了存储数据时应该开辟的空间大小和数据的取值范围。
  • 决定了如何识别一个特定的二进制序列。

一、数据类型分类

在这里插入图片描述

MySQL中的数据类型与编程语言中的数据类型相似,在学习时我们不进行一 一演示,通过讲述一个或两个特定的类型,你也能够触类旁通。

二、数值类型

1、整数类型

MySQL为我们提供了不同占用不同字节大小的整数类型,以便于我们能够更好的使用数据和节省磁盘的空间。

在这里插入图片描述

在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的,可以通过 UNSIGNED 来说明某个字段是无符号的。

这里我们以tinyint类型为例介绍数值类型:

在下面我们创建一张表,并向表中插入一些合法数据,一些非法数据。

create table tiny (num tinyint);
desc tiny;
insert into tiny values (0);
insert into tiny values (-128);
insert into tiny values (127);
insert into tiny values (-129);

在这里插入图片描述

查看表中的内容,发现合法的数据被成功的插入了,非法的数据直接被拒绝插入,说明MySQL不会为我们的整形进行截断转换。

在这里插入图片描述

所以数据类型本身也是一种:约束,通过这种约束我们就能保证数据库中的数据是可预期,完整的;

2、bit类型

基本语法:

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

创建一个表,表当中包含一个int类型表示用户id,和一个8位bit类型表示一些选项。如下:

create table user(id int, op bit(8));
desc user;

在这里插入图片描述

向user表中插入一些数据并显示表中的内容:

insert into user values (124, 1);
insert into user values (127, 97);
select * from user;

在这里插入图片描述

我们发现我们插入的1没有被显示,而我们插入的97却显示成了字符a这因为bit类型在显示时,是按照ASCII码对应的值进行显示的,1是不可显示字符,97对应的就是a

如果我们还是想要让bit类型能够像整数类型那样显示的话,我们可以在显示时对op字段加上hex(以16进制显示)。

select id, hex(op) from user;

在这里插入图片描述

可以看到结构能够正常显示了!

  • bit类型的范围测试

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

create table user_info(id int, gender bit);
desc user_info;

在这里插入图片描述

插入数据

insert into user_info values (12, 0);
insert into user_info values (13, 1);
insert into user_info values (13, 3);
insert into user_info values (14, 5);
select id, hex(gender) from user_info;

在这里插入图片描述
可以看到如果插入gender列的数据不是0或1,那么插入数据时就会产生报错。

建议:

  • 虽然MySQL提供了位类型bit,但一般不建议将数据类型设置成位类型,除非将来这个数据本身就只是给程序看的,并且数据本身非常占用资源。
  • 因为查询位类型数据时,默认会按照ASCII码对应的值进行显示,这对于将来数据库管理员维护数据库或程序员调试程序都是不太方便的。

3、小数类型

  • float类型

语法:

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

特征:

  • 对于小数部分如果超出了精度MySQL在保存值时会进行四舍五入,对于整数部分如果超出精度则拒绝插入。
  • 对于有符号的float的范围是去掉负数只留正数。
  • float表示的精度大约是小数点后7位,但是当float存储较高精度的数据时会出现误差。

案例1

我们创建一个float(4,2),类型,则这个类型可以表示的范围是-99.99 ~ 99.99,然后我们分别向这个表中插入 99.99, -99.9923.655, -36.232100, -100

create table ftable ( price float(4,2) );
desc ftable;
insert into ftable values (99.99);
insert into ftable values (-99.99);
insert into ftable values (23.655);
insert into ftable values (-36.232);
insert into ftable values (100);
insert into ftable values (-100);

在这里插入图片描述

查看表中的内容:

select * from ftable;

在这里插入图片描述

结果符合我们的预期!

案例2

我们在创建一张无符号的float(4,2)表,然后我们插入正数99100.00,和负数-22.01

create table futable( price float(4,2) unsigned );
desc futable;
insert into futable values (99);
insert into futable values (100.00);
insert into futable values (-22.01);
select * from futable;

在这里插入图片描述

查看表的内容后,发现果然正数的范围没有改变,负数不能被插入。

案例3

创建一张float类型的表,然后我们向其中插入2202.31234567891.23456789,然后观察表中的结果。

create table fltable( num float );
insert into fltable values (2202.3);
insert into fltable values (2202.3);
insert into fltable values (123456789);
insert into fltable values (1.23456789);
select * from fltable;

在这里插入图片描述

我们发现对于精度较高的数据,无论是正数部分太大,还是小数部分太多,都会导致float类型存储时出现误差。

  • decimal类型

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

语法:

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

特征

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

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

create table dectable( num float(10,8), num2 decimal(10,8) );
desc dectable;

在这里插入图片描述

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

insert into dectable values (23.12345612, 23.12345612);
select * from dectable;

在这里插入图片描述

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

三、字符串类型

  • char类型

语法:

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

特征

  • char类型的单位是字符,而不是字节,无论是英语a,还是汉语,甚至感叹号!等都表示一个字符。

例如我们先创建一张表,包含一个chart字段,这个字段的类型我们设置为char(4),然后我们向其插入:

abc你好啊~A,你好A,你好啊

creat table ch (chart char(4));
desc ch;

在这里插入图片描述

进行插入,并显示:

insert into chart values ('abc');
insert into ch values ('你好啊~');
insert into ch values ('A,你好');
insert into ch values ('A,你好啊');
select * from ch;

在这里插入图片描述

结果符合我们的预期,对于A,你好啊,这个数据的字符长度是大于4的所以不能够被正常插入。

优点

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

  • varchar类型

语法:

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

说明:

varchar类型是可变长字符串类型,其使用与char并无区别,但是varchar能够更加节省空间

在上面char类似的案例演示中,如果我们使用的是utf8编码,对于char(4),MySQL其实在底层默认给我们分配了: 4 ∗ 3 = 12 4 * 3 = 12 43=12个字节, 上面的演示案例中,如果我们存放的是abc三个字符,其实我们只需要是使用了3个utf8字符,即9个字节,另外的3个字节被浪费了,而varchar出现就能改变这种状况。

特征

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

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

    • 对于utf8编码来说,一个字符占用三个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 3 = 21844 。
    • 对于gbk编码来说,一个字符占用两个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 2 = 32766 。
  • 案例1

和char一样,我们先创建一张表,包含一个varchar字段,这个字段的类型我们设置为varchar(4),然后我们向其插入:

abc你好啊~A,你好A,你好啊

create table varch (varch varchar(4));
desc varch;

在这里插入图片描述

insert into varch values ('abc');
insert into varch values ('你好啊~');
insert into varch values ('A,你好');
insert into varch values ('A,你好啊');
select * from varch;

在这里插入图片描述

结果与使用char没有差别,差别在于使用utf8时底层varchar对于abc分配使用的空间相比于char要少。

  • 案例2

由于varchar类型的字节数限制,在定义编码格式为utf8的表时,varchar(L)中的L如果超过了21844,则会产生报错。如下:

create table utf8_table (content varchar(21845)) charset=utf8;
create table utf8_table (content varchar(21844)) charset=utf8;

在这里插入图片描述

由于varchar类型的字节数限制,在定义编码格式为gbk的表时,varchar(L)中的L如果超过了32766,则会产生报错。如下:

create table gbk_table (content varchar(32767)) charset=gbk;
create table gbk_table (content varchar(32766)) charset=gbk;

在这里插入图片描述

  • char和varchar比较

char和varchar的区别如下

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

char和varchar的优缺点如下:

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

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

四、时间日期类型

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

  • date:日期格式为YYYY-MM-DD,占用三字节。
  • datetime:时间日期格式为YYYY-MM-DD HH:MM:SS,占用八字节。
  • timestamp:时间戳,格式为YYYY-MM-DD HH:MM:SS,占用四字节,值得注意的是这个字段,我们不主动修改的话,此字段就会自动插入当前的时间戳。

创建一个表,表当中包含date、datetime两种时间日期类型的列。如下:

create table time( t1 date, t2 datetime );
desc time;

在这里插入图片描述

insert into time values ('2023-11-01', '2023-11-01 22:53:40');
select * from time;

在这里插入图片描述

  • timestamp类型使用案例

利用timestamp会自动更新时间的特性,我们可以创建一个评论表,表当中包含评论人的昵称、评论的内容和评论的发布时间。如下:

create table comment_table ( name varchar(20), content text(100), publish_time timestamp);desc comment_table;

在这里插入图片描述

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

update comment_table set content='加油!';
select * from comment_table;

在这里插入图片描述

五、enum和set类型

enumset类型的区别如下:

  • 在定义enum字段时需要提供若干个选项的值,在设置enum字段值时只允许选取其中的一个值。
  • 在定义set字段时需要提供若干个选项的值,在设置set字段值时可以选取其中的一个或多个值。

语法:

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

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

  • set
set('选项值1','选项值2','选项值3', ...);

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值在MySQL内部实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,…最多64个。(即每个比特位都不相等的「位图结构」)

调查表案例

我们现在需要做一个爱好调查表,包含名称,性别,爱好。

分析:

  • 名称我们可以定义为varchar类型以节省空间。
  • 人的性别只能从男和女中进行二选一,因此可以定义成enum类型。
  • 人的爱好在提供的选项中可能存在多个,因此可以定义成set类型。

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

create table investigation( name varchar(20), gender enum('男','女'), hobby set('下棋','打篮球','游泳','跑步','跳绳'));desc investigation;

在这里插入图片描述

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

insert into investigation values ('张飞', '男', '打篮球,游泳,跑步');
select * from investigation;

在这里插入图片描述

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

在这里插入图片描述

在插入记录时,除了通过指明多个选项来设置爱好,还可以通过数字的方式来设置,(对应的比特位进行映射,例如31的比特位为全1,对应的就是五个爱好全部插入)。如下:

在这里插入图片描述

enum和set查找

  • where子句进行 「行匹配」
SELECT 选项 表名称 WHERE 字段=想要匹配的信息

如果想要筛选出调查表中所有女生的信息,那么直接在select筛选时指明gender='女'即可。

select * from investigation where gender='女';

在这里插入图片描述

但是对于set类型我们使用where子句,进行的匹配是严格匹配,例如我们想要筛选出所有喜欢跳绳的人:

select * from investigation where hobby='跳绳';

在这里插入图片描述

我们只是匹配到了刘禅,而没有匹配到其他人,要解决这个问题我们就要要借助MySQL给我们提供的find_in_set(str,strlist)函数了。

  • 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.mzph.cn/news/241551.shtml

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

相关文章

AI创作系统ChatGPT系统源码,支持Midjourney绘画,GPT语音对话+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

R语言基础 | 安徽某高校《统计建模与R软件》期末复习

第一节 数字、字符与向量 1.1 向量的赋值 c<-(1,2,3,4,5) 1.2 向量的运算 对于向量&#xff0c;我们可以直接对其作加&#xff08;&#xff09;&#xff0c;减&#xff08;-&#xff09;&#xff0c;乘&#xff08;*&#xff09;&#xff0c;除&#xff08;/&#xff09…

【shell脚本实战学习笔记】#1

shell脚本实战学习笔记#1 脚本编写场景需求&#xff1a; 编写一个比较数据大小的shell脚本&#xff0c;要求判断用户只能输入两位数字&#xff0c;不能是字符或其他特殊字符&#xff1b;并且在shell脚本中需要用到函数来控制执行顺序。 知识点&#xff1a;shell函数&#xff…

科研学习|论文解读——面向电商内容安全风险管控的协同过滤推荐算法研究

【论文完整内容详见知网链接】&#xff1a; 面向电商内容安全风险管控的协同过滤推荐算法研究 - 中国知网 (cnki.net) 面向电商内容安全风险管控的协同过滤推荐算法研究* 摘 要&#xff1a;[目的/意义]随着电商平台商家入驻要求降低以及商品上线审核流程简化&#xff0c;内容安…

Centos安装vsftpd:centos配置vsftpd,ftp报200和227错误

一、centos下载安装vsftpd&#xff08;root权限&#xff09; 1、下载安装 yum -y install vsftpd 2、vsftpd的配置文件 /etc/vsftpd.conf 3、备份原来的配置文件 sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup 4、修改配置文件如下&#xff1a;vi /etc/vsftpd.conf …

体验一下 CodeGPT 插件

体验一下 CodeGPT 插件 0. 背景1. CodeGPT 插件安装2. CodeGPT 插件基本配置3. (可选)CodeGPT 插件预制提示词原始配置(英文)4. CodeGPT 插件预制提示词配置(中文)5. 简单验证一下 0. 背景 看到B站Up主 “wwwzhouhui” 一个关于 CodeGPT 的视频&#xff0c;感觉挺有意思&#…

SpringMVC:整合 SSM 中篇

文章目录 SpringMVC - 04整合 SSM 中篇一、优化二、总结三、说明注意&#xff1a; SpringMVC - 04 整合 SSM 中篇 一、优化 在 spring-dao.xml 中配置 dao 接口扫描&#xff0c;可以动态地实现 dao 接口注入到 Spring 容器中。 优化前&#xff1a;手动创建 SqlSessionTempl…

STM32实现三个小灯亮

led.c #include"led.h"void Led_Init(void) {GPIO_InitTypeDef GPIO_VALUE; //???RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//???GPIO_VALUE.GPIO_ModeGPIO_Mode_Out_PP;//???? ????GPIO_VALUE.GPIO_PinGPIO_Pin_1|GPIO_Pin_2|GPIO_P…

spring-validation实现分组校验

文章目录 前言实际开发可能会使用到分组校验maven添加依赖简单使用高级应用分组自定义分组组合分组 源码地址 前言 JSR 303中提出了Bean Validation&#xff0c;表示JavaBean的校验&#xff0c;Hibernate Validation是其具体实现&#xff0c;并对其进行了一些扩展&#xff0c;…

Arduino上U8g2库显示中文的经历

u8g2自带很多中文库&#xff1b;但是向u8g2_font_wqy12_t_chinese3 比较全的应该是u8g2_font_wqy12_t_gb2312 这个&#xff0c;只是我还没有调用成功 这个库&#xff0c;中文就显示不全&#xff1b;有些没有定义&#xff0c;如百家姓 #include <Arduino.h> #include <…

Java经典框架之Spring

Java经典框架之Spring Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring简介 2.…

HA启动Advanced SSH Web Terminal 提示附加组件似乎尚未准备就绪,它可能仍在启动。是否要再试一次?

环境&#xff1a; Home Assistant OS11.1 Advanced SSH & Web Terminal 17.0 问题描述&#xff1a; HA安装好SSH加载项&#xff0c;启动Advanced SSH & Web Terminal 提示附加组件似乎尚未准备就绪&#xff0c;它可能仍在启动。是否要再试一次&#xff1f; 解决方案…

.NET中的Swagger使用

目录 前言 一、Swagger是什么&#xff1f; 二、如何Swagger文档说明的信息 1.在AddSwaggerGen方法中写入文档信息 2.运行效果 二、文档UI界面标题、路由设置 1.在中间件UseSwaggerUI方法中配置 三、文档UI界面添加接口注释 1.在 .csproj中配置 2.在AddSwaggerGen方法中配置Incl…

Apache Spark简介与历史发展

在当今信息爆炸的时代&#xff0c;大数据处理已成为了现实。企业和组织需要处理海量数据来获得有用的信息和见解。Apache Spark作为一个开源的大数据处理框架&#xff0c;已经在大数据领域占据了重要地位。 Apache Spark简介 Apache Spark是一个用于大规模数据处理的快速、通…

新版IDEA中Git的使用(一)

说明&#xff1a;本文介绍如何在新版IDEA中使用Git 创建项目 首先&#xff0c;在GitLab里面创建一个项目&#xff08;git_demo&#xff09;&#xff0c;克隆到桌面上。 然后在IDEA中创建一个项目&#xff0c;项目路径放在这个Git文件夹里面。 Git界面 当前分支&Commit …

Qt/QML编程学习之心得:在QML中调用fileDialog(十六)

Qt中有一些内置的对话框dialog,比如 在QWidget工程中使用比较容易,比如 #include <QFileDialog>fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), "/home/jana", tr("Image Files (*.png *.jpg *.bmp)")); 那么在QM…

word2003 open word2007+

Win 7 C:\Documents and Settings\Administrator\Application Data\Microsoft\Templates 还是不行&#xff0c;重装office2003吧&#xff0c;再安装转换插件&#xff0c;但是再高版本好像没转换工具

由正规表达式构造DFA,以及DFA的相关化简

目录 1.由正规式到DFA 首先讲如何从正规式到NFA 如何从NFA到DFA 2.DFA的化简 3.DFA和NFA的区别 1.由正规式到DFA 正规式--->NFA---->DFA 首先讲如何从正规式到NFA 转换规则: 例题1&#xff1a;这里圆圈里面的命名是随意的&#xff0c;只要能区别开就可以了 如何…

助力打造清洁环境,基于YOLOv4开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统

公共社区环境生活垃圾基本上是我们每个人每天几乎都无法避免的一个问题&#xff0c;公共环境下垃圾投放点都会有固定的值班时间&#xff0c;但是考虑到实际扔垃圾的无规律性&#xff0c;往往会出现在无人值守的时段内垃圾堆放垃圾桶溢出等问题&#xff0c;有些容易扩散的垃圾比…

【UML】第12篇 序列图(1/2)——基本概念和构成

目录 一、什么是序列图&#xff08;Sequence Diagram&#xff09; 1.1 定义 1.2 主要用途 1.3 序列图和BPMN的区别和联系 二、序列图的构成 2.1 对象 2.2 生命线 2.3 消息 2.4 激活 序列图&#xff0c;是我个人认为的用处最多的一种图。产品和研发的同学&#xff0c;都…