MySQL【数据类型】

MySQL【数据类型】

一、数据类型分类

合适的数据类型不仅能节省磁盘空间,还能提升数据查询和操作的效率,甚至避免因数据越界、精度丢失带来的业务问题。

二、 数值类型

数值类型是 MySQL 中最常用的类型之一,用于存储整数、小数等数字数据,又可细分为整型位类型浮点型定点型。整型支持有符号(SIGNED)和无符号(UNSIGNED)两种模式,默认是有符号,无符号类型仅能存储非负数。

整型的核心特点是占用字节固定取值范围明确,越界插入会直接报错。MySQL 提供了 5 种整型,从 1 字节的 TINYINT 到 8 字节的 BIGINT,满足不同的数值存储需求,其详细参数如下表:

类型占用字节有符号范围无符号范围
TINYINT1-128 ~ 1270 ~ 255
SMALLINT2-32768 ~ 327670 ~ 65535
MEDIUMINT3-8388608 ~ 83886070 ~ 16777215
INT4-2147483648 ~ 21474836470 ~ 4294967295
BIGINT8-9223372036854775808 ~ 92233720368547758070 ~ 18446744073709551615
  • 越界会直接报错:有符号 TINYINT 插入 128、无符号 TINYINT 插入 - 1,都会触发Out of range错误,MySQL 不会自动转换值;
  • 慎用 UNSIGNED:官方建议尽量不使用无符号类型,若 INT 存储不下数据,INT UNSIGNED 也大概率存不下,直接将类型提升为 BIGINT 更稳妥;
  • BOOL 本质是 TINYINT (1):MySQL 中没有真正的布尔类型,BOOL/BOOLEAN 是 TINYINT (1) 的别名,用 0 表示假,1 表示真。

2.1 tinyint类型

越界测试

在MySQL中 , 整型可以指定是有符号和无符号的 , 默认是有符号的可以通过UNSIGNED来说明某个字段是无符号的以上的案例我们可以知道 , 如果不在合法的数据范围 , 会发生直接拦截 , 不允许进行数据的插入 , 一定程度上约束了用户对数据的插入。
从另外一个方面来看 , 如果数据成功的插入的表格中 , 这个数据一定是合法的(或者做过一些符合规范的数据处理,比方说后面所说的浮点数)。Mysql 能保证数据插入的合法性 , 就能数据库中的数据是可预期性的 【数据访问已知】、完整的【没有发生半阶段和类型转化】对于类型的选择,一般视情况而论,比方说 , 年龄不会出现负数,我们就可以使用unsigned类型 ~

2.2 bit 类型

基本语法:

显示规则特殊:BIT 字段查询时,会按照ASCII 码对应的值显示,而非直接显示数字。例如插入 65,会显示字符 'A';精准控制存储位数适合存储仅 0/1 的状态值(如性别:0 - 女,1 - 男),定义为BIT(1)可最大限度节省空间;越界会报错:插入的值超过 M 位表示的范围,会触发Data too long错误。
bit 字段在显示的时候 , 是按照ASCII码对应的值显示 。上面的2插入失败的原因是 , 越界了 , 定义online的类型是 bit(1) ;如果想要显示出 0/1可以使用查询的方式打开 , 以16进制的方式显示出来~
使用合适的数据类型,不但可以满足应用场景 , 还可以节省资源【空间】;

三、小数类型

当需要存储带小数的数值(如金额、薪资、身高)时,需使用浮点型(FLOAT/DOUBLE)或定点型(DECIMAL),二者的核心区别是精度不同,浮点型存在精度丢失,定点型则精准存储。

3.1 float

语法:

FLOAT:占用 4 字节,精度约 7 位,语法FLOAT[(M,D)] [UNSIGNED]DOUBLE:占用 8 字节,精度比 FLOAT 更高,语法DOUBLE[(M,D)] [UNSIGNED];其中M表示显示长度(整数 + 小数的总位数),D表示小数位数,MySQL 会对插入的值进行四舍五入处理。【前提是要在合法的大小内】核心特性FLOAT(4,2)表示总长度 4 位、小数 2 位,有符号范围为-99.99 ~ 99.99,无符号范围为0 ~ 99.99;若插入值的小数位超过 D,会自动四舍五入,若整体超过 M 则越界报错。
用浮点数来表示数据,由于浮点数的特殊性 , 可能有一些数据会存在精度丢失。

3.2 decimal

语法:

DECIMAL 是定点数,语法DECIMAL(M,D) [UNSIGNED]与浮点型参数含义一致,但不会丢失精度,是存储金额、汇率等财务数据的首选。

  • 发现decimal的精度更加准确 , 因此如果我们希望某个数据表示高精度 , 选择decimal
  • 浮点型 vs 定点型核心区别
特性FLOAT/DOUBLEDECIMAL
精度约 7 位(FLOAT),更高(DOUBLE)精准,无丢失
占用空间固定(4/8 字节)随 M/D 变化
M/D 范围无严格大限制M 最大 65,D 最大 30,默认 D=0、M=10
适用场景普通小数(如身高、体重)高精度小数(如金额、薪资)

四、字符串类型

MySQL 的字符串类型主要包括定长 CHAR变长 VARCHAR,以及存储大文本 / 二进制的TEXT/BLOB,其中 CHAR 和 VARCHAR 是日常使用最频繁的类型,核心区别在于存储方式和空间占用。

4.1 char

语法:

固定空间无论实际存储的字符数多少,都会开辟 L 个字符对应的字节空间,例如CHAR(2)存储ab中国,都占用 2 个字符的空间;效率更高:因为空间固定,MySQL 无需计算实际存储长度,查询和写入速度更快字符兼容支持字母、数字、汉字等所有字符,L 表示字符数,而非字节数(如 utf8 编码下,1 个汉字占 3 字节,CHAR(2)可存 2 个汉字)。
char(2) 可以存放两个字符 , 可以是字母或者汉字 , 但是不可以超过2个,最多只能是255

4.2 varchar

语法:

语法VARCHAR(L),其中L 表示最大字符数,单位是字符,其最大存储能力与表的编码格式密切相关,核心原因是 MySQL 行最大字节数为 65535,且 VARCHAR 会用 1~3 个字节记录数据的实际长度。

动态空间:实际占用空间 =字符实际字节数 + 1~3 个长度记录字节,例如VARCHAR(4)存储A,仅占用 1 个字符的字节 + 1 个长度字节,节省空间;编码限制 L 的最大值:utf8 编码:1 个字符占 3 字节,L 最大值 = 65532/3=21844;gbk 编码:1 个字符占 2 字节,L 最大值 = 65532/2=32766;字符兼容:与 CHAR 一致,L 表示字符数,支持多类型字符。

4.3 char 和 varchar比较

实际存储内容CHAR (4) 存储VARCHAR (4) 存储CHAR 占用字节VARCHAR 占用字节
abcdabcdabcd4*3=124*3+1=13
AA(补空格)A4*3=121*3+1=4
Abcde越界报错越界报错数据超长数据超长
选 CHAR 的场景:数据长度固定不变,追求操作效率,例如身份证号、手机号、MD5 值、邮编等;选 VARCHAR 的场景:数据长度不固定,需要节省空间,例如姓名、地址、商品名称等,注意保证 L 能容纳最长的内容;选 TEXT/BLOB 的场景:存储超长篇幅的内容,例如文章正文、图片二进制数据、日志内容等(TEXT 不支持全文索引和默认值)。

五、日期和时间类型

MySQL 提供了 DATE、DATETIME、TIMESTAMP 三种常用的日期时间类型,分别适配不同的时间存储需求,核心区别在于存储格式、占用字节和自动更新特性其中 TIMESTAMP 的自动更新是实战中的常用技巧。

类型存储格式占用字节时间范围核心特性
DATEyyyy-mm-dd31000-01-01 ~ 9999-12-31仅存储日期,无时间
DATETIMEyyyy-mm-dd hh:mm:ss81000-01-01 ~ 9999-12-31存储日期 + 时间,无自动更新
TIMESTAMPyyyy-mm-dd hh:mm:ss41970-01-01 ~ 2038-01-19存储日期 + 时间,支持自动更新
TIMESTAMP 是时间戳类型,基于 1970-01-01 00:00:00(UTC)开始的秒数计算,其最核心的特性是自动补全和自动更新插入数据时,若未给 TIMESTAMP 字段赋值,会自动填充当前系统时间更新数据时,若未修改 TIMESTAMP 字段,会自动更新为当前系统时间

该特性非常适合存储数据创建时间数据更新时间,无需手动赋值,简化业务代码。

timestamp的作用是什么?

例如:发表评论:

显示评论发布的时间~

更新的时间~

datetime的作用是什么?

让程序员去维护不会随时间变化的时间,存储固定的时间 。场景:入职时间,离职时间。

 

date的作用是什么?

只记录日期。场景:结婚日期,生日时间。

六、enum 和set

语法:

在业务中,经常会遇到单选(如性别:男 / 女)、多选(如爱好:登山 / 游泳 / 篮球)的场景,若使用 VARCHAR 存储,会导致数据不规范、查询困难,而 MySQL 提供的ENUMSET类型可完美解决该问题,二者均为字符串对象,底层以数字存储,效率更高。

枚举约束,不允许插入其他数据

是否有招商银行的账号:

1. 有 , 但是没钱,空串

2. 没有   NULL

枚举的时候写数值代表下标set的时候写数值代表位图插入:可以字面值 , 也可以使用数值

 如何进行查找?

但是如果我需要的是把爱好有羽毛球的筛选出来,而不是把爱好只要羽毛球的筛选出,该如何解决?

find_in_set函数

学习mysql的一个筛选函数 find_in_set

所以,对于在hobby集合中查找有羽毛球爱好的人,我们可以这么写:

数据类型就是mysql中天然的约束,如果存在满足这个约束,mysql允许你插入数据,如果不是很匹配,例如浮点数,mysql会做它的处理 , 其余的不满足约束 , 则拒绝插入 。 

Read more

Flutter 三方库 workiva_analysis_options 的鸿蒙化适配指南 - 实现工业级的代码质量审计与 Linter 规约对齐、支持端侧工程架构健康度自动检测实战

Flutter 三方库 workiva_analysis_options 的鸿蒙化适配指南 - 实现工业级的代码质量审计与 Linter 规约对齐、支持端侧工程架构健康度自动检测实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 workiva_analysis_options 的鸿蒙化适配指南 - 实现工业级的代码质量审计与 Linter 规约对齐、支持端侧工程架构健康度自动检测实战 前言 在进行 Flutter for OpenHarmony 的企业级大型分布式项目开发时,如何统一上百名开发者的代码风格?简单的 analysis_options.yaml 默认配置往往无法满足金融、工业等严苛领域对代码健壮性、可维护性的极致要求。workiva_analysis_options 合集了来自顶级工程实践的代码静态分析规约。本文将探讨如何在鸿蒙端构建一道坚不可摧的代码质量防线。 一、原直观解析 / 概念介绍 1.1 基础原理 该库本质上是一套高度严谨的 Linter 指令集。它通过对 Dart 核心分析引擎建议集的精妙筛选,强制开启了涉及内存安全(Avoid Unnecessary

OpenClaw04_Gateway常见问题

OpenClaw04_Gateway常见问题

OpenClaw04_Gateway常见问题 文章目录 * OpenClaw04_Gateway常见问题 * 一、基础概念篇 * Q1: OpenClaw Gateway 是什么?它的核心职责是什么? * Q2: Gateway 与 Agent 的关系是什么?为什么不能把 Gateway 当作 OpenClaw 的核心? * Q3: Gateway 的默认端口是什么?Canvas Host 又是什么? * 二、配置管理篇 * Q4: OpenClaw 的配置文件在哪里?是什么格式? * Q5: 如何修改 Gateway 的监听端口和绑定地址? * Q6: 配置更改后需要重启 Gateway 吗? * Q7: 如何启动多个 Gateway 实例进行隔离测试? * 三、路由与会话篇 * Q8: 什么是

高可用集群:平滑切换的架构对比与落地指南

高可用集群:平滑切换的架构对比与落地指南

前言 做金融、政务、运营商等行业的数据库架构师,对Oracle RAC一定不陌生——作为业内成熟的高可用集群方案,Oracle RAC凭借多节点共享存储的架构,支撑了无数核心系统的7×24小时运行。但在国产化替代的大趋势下,“去O”不仅要解决单库的兼容问题,更要攻克高可用集群的平滑迁移难题:毕竟核心系统对停机时间的容忍度几乎为0,一旦集群切换出问题,轻则业务中断,重则引发数据错乱、监管风险,这也是很多企业在“去O”过程中最不敢触碰的环节。 很多企业的顾虑很实际:金仓的高可用集群和Oracle RAC架构差异有多大?核心的高可用能力比如故障自动切换、负载均衡、数据一致性,能和Oracle RAC持平吗?迁移过程中怎么保障业务不中断?原有基于Oracle RAC的运维体系能复用吗?这些问题如果没有明确答案,企业根本不敢轻易启动集群迁移。 作为国产数据库的领军者,电科金仓的KingbaseES(KES)针对Oracle RAC用户的迁移痛点,打造了一套高度兼容、能力对标、无缝切换的高可用集群解决方案,不仅在架构设计上贴合Oracle RAC用户的使用习惯,更在故障切换、负载均衡、数据同

拒绝 AI 盲目梭哈:拆解 Garry Tan 的 gstack 架构逻辑

拒绝 AI 盲目梭哈:拆解 Garry Tan 的 gstack 架构逻辑

拒绝 AI 盲目梭哈:拆解 Garry Tan 的 gstack 架构逻辑 YC 的 Garry Tan 把他那套压箱底的 AI 开发流开源了,名字很直白,叫 gstack。看了一圈源码,这东西的本质不是什么自动化写代码的脚本,而是给 Claude Code 这种暴力工具装上了一个基于现代软件工程流程的约束框架。它把 Claude 从一个随时可能失控的单兵,强行捏合成了一个由 CEO、工程经理和 QA 组成的虚拟公司。 如果你觉得现在的 AI 编程只是在玩简单的 Prompt 对话,那 gstack 的思路可能会让你清醒一点:它不是在教 AI 怎么写代码,而是在教 AI 怎么像个正经的工程团队一样协同。我看重的是它对冲动编码的抑制,这才是架构师该有的思维。 https: