【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中,使用 FLOAT 或 DOUBLE 数据类型时可能会遇到精度丢失的问题。这是因为 FLOAT 和 DOUBLE 类型是基于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占用字节数 |
|---|---|---|---|---|
| abcd | abcd | abcd | 4*3=12 | 4*3+1=13 |
| A | A | A | 4*3=12 | 1*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

相关文章:
【MySQL-数据类型】数据类型分类+数值类型+文本、二进制类型+String类型
一、数据类型分类 二、数值类型 1.bit类型 测试环境ubuntu 基本语法: bit[(M)]:位字段类型,M表示每个值的位数,范围从1~64;如果M被忽略,默认为1举例: create table testBit(id i…...
小谈java内存马
基础知识 (代码功底不好,就找ai优化了一下) Java内存马是一种利用Java虚拟机(JVM)动态特性(如类加载机制、反射技术等)在内存中注入恶意代码的攻击手段。它不需要在磁盘上写入文件,…...
简单的二元语言模型bigram实现
内容总结归纳自视频:【珍藏】从头开始用代码构建GPT - 大神Andrej Karpathy 的“神经网络从Zero到Hero 系列”之七_哔哩哔哩_bilibili 项目:https://github.com/karpathy/ng-video-lecture Bigram模型是基于当前Token预测下一个Token的模型。例如&#x…...
【清华大学】实用DeepSeek赋能家庭教育 56页PDF文档完整版
清华大学-56页:实用DeepSeek赋能家庭教育.pdf https://pan.baidu.com/s/1BUweVDeG2M8-t0QaIs3LHQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/8a9473493bb0 《实用DeepSeek赋能家庭教育》基于清华大学研究成果,系统阐述了DeepSeek人工智能技…...
黑洞如何阻止光子逃逸
虽然涉及广义相对论,但广义相对论说的是大质量物体对周围空间的影响,而不是说周围空间和空间中的光子之间的关系。也就是说,若讨论光子逃逸问题,则不必限定于大质量的前提,也就是说,若质量周围被扭曲的空间…...
1.4 单元测试与热部署
本次实战实现Spring Boot的单元测试与热部署功能。单元测试方面,通过JUnit和Mockito等工具,结合SpringBootTest注解,可以模拟真实环境对应用组件进行独立测试,验证逻辑正确性,提升代码质量。具体演示了HelloWorld01和H…...
window系统中的start命令详解
start 是 Windows 系统中用于启动新进程或打开新窗口来运行指定程序或命令的命令。以下是对 start 命令参数的详细解释: 基本语法 start ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENO…...
AI编程工具节选
1、文心快码 百度基于文心大模型推出的一款智能编码助手, 官网地址:文心快码(Baidu Comate)更懂你的智能代码助手 2、通义灵码 阿里云出品的一款基于通义大模型的智能编码辅助工具, 官网地址:通义灵码_你的智能编码助手-阿里云 …...
正则表达式,idea,插件anyrule
package lx;import java.util.regex.Pattern;public class lxx {public static void main(String[] args) {//正则表达式//写一个电话号码的正则表达式String regex "1[3-9]\\d{9}";//第一个数字是1,第二个数字是3-9,后面跟着9个数字…...
原生iOS集成react-native (react-native 0.65+)
由于官方文档比较老,很多配置都不能用,集成的时候遇到很多坑,简单的整理一下 时间节点:2021年9月1日 本文主要提供一些配置信息以及错误信息解决方案,具体步骤可以参照官方文档 原版文档:https://reactnative.dev/docs…...
java错题总结
本篇文章用来记录学习javaSE以来的错题 解答:重载要求俩个方法的名字相同,但参数的类型或者个数不同,但是不要求返回类型相同,所以A正确。 重写还需要要求返回类型相同(呈现父子类关系也可以,但是属于特例&…...
【商城实战(10)】解锁商品信息录入与展示的技术密码
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
2025年主流原型工具测评:墨刀、Axure、Figma、Sketch
2025年主流原型工具测评:墨刀、Axure、Figma、Sketch 要说2025年国内产品经理使用的主流原型设计工具,当然是墨刀、Axure、Figma和Sketch了,但是很多刚入行的产品经理不了解自己适合哪些工具,本文将从核心优势、局限短板、协作能…...
MDM 如何彻底改变医疗设备的远程管理
在现代医疗行业迅速发展的格局中,医院和诊所越来越依赖诸如医疗平板和移动工作站等移动设备。这些设备在提高工作效率和提供卓越的患者护理方面发挥着关键作用。然而,随着它们的广泛使用,也带来了一系列挑战,例如在不同地点确保数…...
OpenCV计算摄影学(18)平滑图像中的纹理区域同时保留边缘信息函数textureFlattening()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::textureFlattening 是 OpenCV 中用于图像处理的一个函数,旨在平滑图像中的纹理区域,同时保留边缘信息。该技术特别适…...
用DeepSeek学Android开发:Android初学者遇到的常见问题有哪些?如何解决?
答案来自 DeepSeek Q: Android初学者遇到的常见问题有哪些?如何解决? A: Android初学者在学习过程中常会遇到以下问题及对应的解决方法,按类别整理如下: 一、开发环境问题 Android Studio安装或配置问题 问题:安装失…...
springboot 集成 MongoDB 基础篇
demo架构: Book Controller: package com.zy.controller;import com.zy.entity.Book; import com.zy.service.MongoDbService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.Get…...
大白话html语义化标签优势与应用场景
大白话html语义化标签优势与应用场景 大白话解释 语义化标签就是那些名字能让人一看就大概知道它是用来做什么的标签。以前我们经常用<div>来做各种布局,但是<div>本身没有什么实际的含义,就像一个没有名字的盒子。而语义化标签就像是有名…...
恶劣天候三维目标检测论文列表整理
恶劣天候三维目标检测论文列表 图摘自Kradar 🏠 介绍 Hi,这是有关恶劣天气下三维目标检测的论文列表。主要是来源于近3年研究过程中认为有意义的文章。希望能为新入门的研究者提供一些帮助。 可能比较简陋,存在一定的遗漏,欢迎…...
conda的环境起的jupyter用不了已经安装的包如何解决
当你在使用Conda环境中的Jupyter Notebook时遇到无法读取某些库或模块的问题,通常是由以下几个原因引起的: 环境未激活:确保你已经在正确的Conda环境中激活了Jupyter Notebook。 库未安装:可能你需要的库没有在当前的Conda环境中…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
