【MySQL-数据类型】数据类型分类+数值类型+文本、二进制类型+String类型

一、数据类型分类

在这里插入图片描述

二、数值类型

1.bit类型

测试环境ubuntu

基本语法:

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

举例:

create table testBit(id int, a bit(8));
insert into testBit values(10,10);
select * from testBit;#当我们进行查询的时候,发现以16进制出现

在这里插入图片描述

在这里插入图片描述

当我们以十六进制进行输出时,发现是字符A(16进制数,还是十进制中的10)

在这里插入图片描述

如果我们添加一个不在范围内的数据,如下图所示,mysql直接拒绝了用户的操作

在这里插入图片描述

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

反过来,如果我们已经有数据被成功插入到mysql中了,一定插入的时候是合法的

所以,mysql中,一般而言,数据类型本身也是一种:约束

这种约束:倒逼程序员,让程序员尽可能进行正确的插入

约束:约束使用者

另外,如果你不是一个很好的使用者,mysql也能保证数据插入的合法性;这样就能够保证数据库中的数据是可预期的,完整的

测试环境Centos

在这里插入图片描述

bit使用注意事项:

在这里插入图片描述

在这里插入图片描述

2.tinyint类型

语法:

tinyint [unsigned]

【测试一】有符号tinyint测试(-128~127):

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

在这里插入图片描述

现在插入越界数值,mysql会拒绝插入

insert into testTinyInt values(128);
insert into testTinyInt values(-129);

在这里插入图片描述

【测试二】无符号tinyint测试(0~255)

create table testTinyIntUn(num tinyint unsigned);
insert into testTinyIntUn values (0);
insert into testTinyIntUn values (255);
insert into testTinyIntUn values (128);
select * from testTinyIntUn;
desc testTinyIntUn;

在这里插入图片描述

现在插入越界数值,mysql会拒绝插入

insert into testTinyIntUn values(-1);
insert into testTinyIntUn values(-256);

在这里插入图片描述

说明:

  • 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的
  • 可以通过unsigned来说明某个字段是无符号的
  • 根据自己实际情况选择不同类型,虽然不同类型之间只差几个字节,但是用于百万级别,千万级别列表情况下,省下来的不是一芯半点了

3.int类型

语法:

int(M) zerofill
  • M:这是可选的参数,用于指定显示宽度。M 的值指定了该字段显示的最小位数。如果插入的数值的位数少于 M 指定的位数,那么数值将在左侧填充零以达到指定的宽度。
  • ZEROFILL:这是一个属性,当与 INT 类型一起使用时,如果数值的位数少于指定的宽度,则在数值的左侧填充零。

在这里插入图片描述

需要注意的是:

  • ZEROFILL 不会改变数值的实际存储大小。即使指定了 INT(5) ZEROFILL,整数仍然是按照 INT 的标准大小(通常是4字节)存储的。
  • 如果数值超过了 M 指定的位数,那么 ZEROFILL 不会起作用,数值将按原样显示,而不会填充零。
  • ZEROFILL 自动为该字段添加 UNSIGNED 属性,这意味着你不能在该字段中存储负数。

4.float类型

float[(m,d)] [unsigned]:m指定显示长度,d指定小数位置,占用空间4个字节;那么整数部分位数为m-d

【示例一】设计一个表,该表表示的范围是 -99.99~99.99,MySQL在保存值时会进行四舍五入

create table testFloat(id int, salary float(4,2));
insert into testFloat values(1, -99.99);
insert into testFloat values(2, -99.991);#多的这一点被拿掉了

在这里插入图片描述

insert into testFloat values(3, 3);
insert into testFloat values(4, 0.1);

只要在当前字段范围内的数值,若该数值的小数位数不满d为,mysql会自动在后面补0

在这里插入图片描述

float类型会进行四舍五入,如果五入后超出表示范围,则会报错

insert into testFloat values(5, 99.995);

在这里插入图片描述

【示例二】如果定义的是float(4,2) unsigned ,因为把它指定为无符号的数,范围是0~99.99

create table testFloatUn(id int, salary float(4,2) unsigned);
insert into testFloatUn values(100, -0.1);

在这里插入图片描述

在这里插入图片描述

注意:在MySQL中,使用 FLOATDOUBLE 数据类型时可能会遇到精度丢失的问题。这是因为 FLOATDOUBLE 类型是基于IEEE标准的浮点数,它们在内部使用二进制格式来表示数值,这可能导致某些十进制小数不能精确表示。

create table testFloatDe(num float);
insert into testFloatDe values(123456789.987654321);
select * from testFloatDe;

在这里插入图片描述

MySQL中的 FLOAT 类型默认精度通常是单精度(32位),它只能保证大约7到8位十进制数的精度。当你插入一个非常大的数值,或者一个包含非常多小数位的数值时,超出这个精度的部分就会被舍入或者直接丢失,为了避免精度丢失,我们使用decimal类型

5.decimal类型

语法:

decimal[(m,d)] [unsigned] # 定点数m指定长度,d表示小数点的位数
  • decimal(5,2) 表示的范围是 -999.99 ~ 999.99
  • decimal(5,2) unsigned 表示的范围 0 ~ 999.99
  • decimal 和 float 很像,但是有区别:float 和 decimal 表示的精度不一样
create table testDecimal(id int, salary float(10,8), salary2 decimal(10,8));
insert into testDecimal values(1,12.34567890, 12.34567890);

在这里插入图片描述

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

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

三、文本、二进制类型

1.char类型

语法:

char(L) #固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
create table testChar(name char(20));
insert into testChar values('zhangsan');
insert into testChar values('张三');

无论是汉字还是字符,在mysql中都认为是一个字符

在utf_8中,一个汉字是3个字节;gbk下一个汉字2个字节

在这里插入图片描述

char(2)表示可以存放两个字符,可以是字母或者汉字,但是不能超过2个,最多只能是255

create table testChar1(name char(2));
insert into testChar1 values('张三');

在这里插入图片描述

create table testChar2(name char(256));

在这里插入图片描述

2.varchar类型

语法:

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

举例:

create table testVarchar(id int, name varchar(20));
insert into testVarchar values(1,'张三');
insert into testVarchar values(2,'lisi');

在这里插入图片描述

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

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

2.1.char 和 varchar比较

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

如何选择定长或变长字符串?

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

3.日期和时间类型

常用的日期类型有3中,分别如下:

  • date:日期yyyy-mm-dd,占用三个字节
  • datetime:时间日期yyyy-mm-dd hh:mm:ss,占用八个字节
  • timestamp:时间戳,从1970年开始经过的秒数,表示格式与datetime一致yyyy-mm-dd hh:mm:ss,占用四个字节

案例:

# 创建表
create table birthday(t1 date, t2 datetime, t3 timestamp);# 插入数据 插入两种时间
insert into birthday(t1,t2) values('2001-1-1','2022-6-7 19:00:00');select * from birthday;

ubuntu环境下,添加数据时,时间戳不会自动补上当前时间

在这里插入图片描述

centos环境下,添加数据时,时间戳会自动补上当前时间

centos环境下,更新数据时,时间戳会更新当前时间

//创建表
mysql> create table birthday(t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.01 sec)//插入数据:
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:11:1'); -- 插入两种时间
Query OK, 1 row affected (0.00 sec)mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 1997-07-01 | 2008-08-08 12:01:01 | 2024-11-10 21:22:55 | --添加数据时,时间戳自动补上当前时间
+------------+---------------------+---------------------+//更新数据:
mysql> update birthday set t1='2000-1-1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 2000-01-01 | 2008-08-08 12:01:01 | 2024-11-10 21:23:09 | -- 更新数据,时间戳会更新成当前时间
+------------+---------------------+---------------------+

四、String类型

1.enum

基本语法:

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

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

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

enum比如可以用在性别字段中,只能选择男女

create table student (name varchar(20), gender enum('男','女'));
insert into student values('张三','男');
insert into student values('李四','女');

在这里插入图片描述

如果选择enum之外的值,会报错

insert into student values('王五','保密');

在这里插入图片描述

这里的enum类似于C/C++中的enum,第一个选项代表1,第二个代表选项代表2

单选选项对应的数字是从1开始编号的,而不是从0开始编号的,超出enum的选项值会报错

insert into student values('赵六','1');
insert into student values('田七','2');

在这里插入图片描述

2.set类型

set:集合,“多选”类型

基本语法:

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

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值。最多可以设置64个选项。

【案例】:有一个调查表votes,需要调查人的喜好,比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]

create table votes(name varchar(20),gender enum('男','女'),# 注意:使用数字标识的时候,就是正常的从1开始的数组下标hobby set('登山','游泳','篮球','武术') #注意:使用数字标识每个爱好的时候,想想Linux权限,采用比特位位置来和set中爱好对应起来
);

在这里插入图片描述

插入数据

insert into votes values('张三','男','登山,武术');
insert into votes values('李四','2','登山,武术');
select * from votes where gender=2;

在这里插入图片描述

有如下数据,想查找所有喜欢篮球的人:

在这里插入图片描述

使用如下查询语句

select * from votes where hobby="篮球";

在这里插入图片描述

不能查询出所有爱好为篮球的人

集合查询使用 find_in_set 函数

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

喜好为篮球的人

select * from votes where find_in_set('篮球',hobby);

在这里插入图片描述

不建议在enum中使用选项对应的枚举值,集合值的时候采用数字的方式,因为不利于阅读。

set补充

set使用位图的方式存储各个选项,第一个选项对应1(20),第二个选项为2(21),第三个选项为4(2 ^ 2);这样存储可以大大提高存储效率

在这里插入图片描述

登山:000001---->1

游泳:000010 —>2

登山+游泳:000011 —>3
在这里插入图片描述

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

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

相关文章

golang从入门到做牛马:第一篇-我与golang的缘分,go语言简介

还记得2018年的夏天,刚毕业的我不知道该做些什么,于是自学了一周的go语言,想要找一份go语言工作的代码,当时的go还没有go mod来管理依赖包,在北京找了一个月的工作,找到了一个小公司做了后端开发,当然使用go语言开发,带着兴奋劲,年轻身体也好,边努力学习,边工作。 时…

【数据库】MySQL常见聚合查询详解

在数据库操作中,聚合查询是非常重要的一部分。通过聚合查询,我们可以对数据进行汇总、统计和分析。MySQL提供了丰富的聚合函数来满足不同的需求。本文将详细介绍MySQL中常见的40个聚合函数及其使用场景,并通过8个的案例展示它们的用法。 一、…

调研:如何实现智能分析助手(Agent)(AutoCoder、FastGPT、AutoGen、DataCopilot)

文章目录 调研:如何实现智能分析助手(Agent)(AutoCoder、FastGPT、AutoGen、DataCopilot)一、交互流程二、数据流程三、架构分类四、开源产品4.1 AutoCoder(知识库变体)4.2 FastGPT(…

【Vue CLI脚手架开发】——6.scoped样式

文章目录 一、scoped是什么二、应用案例1.使用代码2.原理3父组件App未添加scoped影响 一、scoped是什么 我们知道vue为了防止css样式污染&#xff0c;在每个组件中提供了 scoped属性进行限定css作用域&#xff1b;当<style>标签有 scoped 属性时&#xff0c;它的 CSS 只…

高精算法的用法及其优势

高精度问题是指当数据的位数非常大&#xff08;超出标准数据类型的范围&#xff09;时&#xff0c;如何进行计算和存储的问题。常见场景包括大整数的加、减、乘、除、取模等操作。以下是解决高精度问题的常用方法与技巧&#xff1a; 一、数据存储 数组存储 用整型数组存储&am…

VM+CentOS虚拟机

关于VMCentOS虚拟机的配置和使用&#xff0c;可以参考以下博客中的详细教程&#xff1a; **一、VMCentOS虚拟机配置** 1. **虚拟机网络配置** - 在VMware中&#xff0c;点击“编辑”→“虚拟网络编辑器”&#xff0c;选择VMnet8并进行相关设置。 - 子网IP可以改成如192.168.1…

设置 CursorRules 规则

为什么要设置CursorRules&#xff1f; 设置 CursorRules 可以帮助优化代码生成和开发流程&#xff0c;提升工作效率。具体的好处包括&#xff1a; 1、自动化代码生成 &#xff1a;通过定义规则&#xff0c;Cursor 可以根据你的开发需求自动生成符合规定的代码模板&#xff0c…

pip install速度太慢的多种解决方案

目录 问题描述为什么 pip 速度这么慢&#xff1f;解决方案1. 使用国内镜像源2. 配置多个镜像源3. 使用第三方工具4. 手动下载后本地安装5. 优化网络环境6. 更新 pip 版本 测试效果 问题描述 在使用 Python 进行开发时&#xff0c;我们经常需要使用 pip 来安装第三方库。然而&am…

Java阻塞队列深度解析:高并发场景下的安全卫士

一、阻塞队列的核心价值 在电商秒杀系统中&#xff0c;瞬时涌入的10万请求如果直接冲击数据库&#xff0c;必然导致系统崩溃。阻塞队列如同一个智能缓冲带&#xff0c;通过流量削峰和异步解耦两大核心能力&#xff0c;成为高并发系统的核心组件。 二、Java阻塞队列实现类对比 …

基于RapidOCR与DeepSeek的智能表格转换技术实践

基于RapidOCR与DeepSeek的智能表格转换技术实践 一、技术背景与需求场景 在金融分析、数据报表处理等领域&#xff0c;存在大量图片格式的表格数据需要结构化处理。本文介绍基于开源RapidOCR表格识别与DeepSeek大模型的智能转换方案&#xff0c;实现以下典型场景&#xff1a; …

django中视图作用和视图功能 以及用法

在 Django REST Framework(DRF)中,视图(View)是处理 HTTP 请求并返回响应的核心组件。DRF 提供了多种视图类,适用于不同的场景和需求。以下是 DRF 中常见的视图类及其作用、使用方法的详细说明: 一、DRF 视图的分类 DRF 的视图可以分为以下几类: 基于函数的视图(Func…

希音(Shein)前端开发面试题集锦和参考答案

用 Node 写过什么工具或 npm 包 在实际开发中,使用 Node 编写过多种实用工具和 npm 包。 自动化构建工具 开发了一个简单的自动化构建工具,用于处理前端项目的资源压缩和合并。在前端项目中,为了优化性能,需要对 CSS 和 JavaScript 文件进行压缩,减少文件体积,同时将多个…

C语言100天练习题【记录本】

C语言经典100题&#xff08;手把手 编程&#xff09; 可以在哔哩哔哩找到 已解决的天数&#xff1a;一&#xff0c;二&#xff0c;五&#xff0c;六 下面的都是模模糊糊的 可以学学这些算法&#xff0c;我是算法白痴&#xff0c;但是我不是白痴&#xff0c;可以学&#xff…

迷你世界脚本文字板接口:Graphics

文字板接口&#xff1a;Graphics 彼得兔 更新时间: 2024-08-27 11:12:18 具体函数名及描述如下: 序号 函数名 函数描述 1 makeGraphicsText(...) 创建文字板信息 2 makeflotageText(...) 创建漂浮文字信息 3 makeGraphicsProgress(...) 创建进度条信息…

Crawl4AI: 赋能AI用户的开源智能网页爬虫与数据提取

Crawl4AI: 赋能AI用户的开源智能网页爬虫与数据提取 在当今人工智能时代&#xff0c;网络爬虫扮演着至关重要的角色。它们不仅是数据收集的强大工具&#xff0c;更是驱动机器学习、自然语言处理等技术发展的关键引擎。 然而&#xff0c;对于用户来说&#xff0c;在面对复杂多…

下载b站视频音频

文章目录 方案一&#xff1a;jjdown如何使用 方案二&#xff1a;bilibili哔哩哔哩下载助手如何使用进入插件网站插件下载插件安装 使用插件下载视频音频&#xff1a;复制音频下载地址 方案三&#xff1a;bat命令下载单个音频下载单个视频下载单个音视频 方案一&#xff1a;jjdo…

【Git】linux搭建Gitea配置mysql数据库

WindowsServer搭建内网Gitea【中文更方便使用】 1. 安装Gitea # 下载 wget https://dl.gitea.io/gitea/1.23.5/gitea-1.23.5-linux-amd642. 创建用户 # 创建 gitea 用户 sudo adduser --system --shell /bin/bash --comment Git Version Control --create-home --home-dir /…

AI绘画软件Stable Diffusion详解教程(6):文生图、提示词细说与绘图案例

文生图即以文字描述来生成图像&#xff0c;这是目前所有AI绘画软件的基本功能之一。要想画一副好的图片&#xff0c;除了选择好的模型&#xff0c;在文生图中&#xff0c;提示词特别关键。 一、什么是提示词&#xff08;Prompt&#xff09; 提示词又称创意、关键词、咒语、ca…

MATLAB实现遗传算法优化风电_光伏_光热_储热优化

1. 问题定义 目标&#xff1a;最小化输出负荷与需求负荷的偏差平方和。决策变量&#xff1a;每个时间步长的风电、光伏、光热和储热输出功率。约束条件&#xff1a; 风电、光伏、光热的输出功率不得超过其最大容量。储热系统的输出功率&#xff08;充放电&#xff09;不得超过…

Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(一)

Ubuntu20.04本地配置IsaacLab的G1训练环境&#xff08;一&#xff09; 配置Omniverse环境配置IsaacSim配置IsaacLab 写在前面&#xff0c;如果Ubuntu剩余空间低于60G&#xff0c;则空间不足&#xff0c;除非你不需要资产包。但资产包中却包含了G1模型、Go2模型等机器人模型和代…