MySQL的数据类型(二)

前面我们简绍了数值类型,bit类型和小数类型,这篇博客我们将学习剩下的数据类型,话不多说现在开始!!

分类 数据类型 详细说明
数值类型 BIT(M) 位类型,M 指定位数,默认值 1,取值范围 1~64
TINYINT [UNSIGNED] 微小整数:有符号范围 -128~127,无符号范围 0~255,默认有符号
BOOL 布尔类型,本质用 0 表示假、1 表示真
SMALLINT [UNSIGNED] 小整数:有符号范围 -2¹⁵ ~ 2¹⁵-1,无符号范围 0 ~ 2¹⁶-1
INT [UNSIGNED] 标准整数:有符号范围 -2³¹ ~ 2³¹-1,无符号范围 0 ~ 2³²-1
BIGINT [UNSIGNED] 大整数:有符号范围 -2⁶³ ~ 2⁶³-1,无符号范围 0 ~ 2⁶⁴-1
FLOAT [(M,D)] [UNSIGNED] 单精度浮点数,M = 总长度,D = 小数位数,占用 4 字节
DOUBLE [(M,D)] [UNSIGNED] 双精度浮点数,精度高于 FLOAT,占用 8 字节
DECIMAL(M,D) [UNSIGNED] 高精度定点数,M = 总长度,D = 小数位数,适合金融数据
文本、二进制类型 CHAR(size) 固定长度字符串,最大长度 255 字符
VARCHAR(size) 可变长度字符串,最大长度 65535 字符
BLOB 二进制大对象,用于存储图片、文件等二进制数据
TEXT 大文本类型,不支持全文索引,不支持设置默认值
时间日期类型 DATE 日期类型,格式:yyyy-MM-dd
DATETIME 日期时间类型,格式:yyyy-MM-dd HH:mm:ss
TIMESTAMP 时间戳类型,格式同 DATETIME,自动记录时间更新
字符串特殊类型 ENUM 枚举类型,值只能是创建表时指定的枚举列表中的单个值
SET 集合类型,值可以是创建表时指定的集合中的零个 / 多个值,多值用逗号分隔(值本身不能含逗号)

一、字符类型(文本/二进制)

类型 最大长度 特点
CHAR(size) 255 字符 定长,不足空格填充,检索快,适合固定长度(如手机号、MD5)
VARCHAR(size) 65535 字符(但受行大小限制) 变长,额外 1~2 字节存长度,节省空间,适合长度变化大(如标题、描述)
TEXT 65535 字符 大文本,不能有默认值,不支持全文索引(除非专门指定),适合长文章
BLOB 65535 字节 二进制数据(图片、文件等),存储的是字节流,无字符集

核心CHAR 定长、VARCHAR 变长、TEXT 超大文本、BLOB 二进制

varchar

会发现这里我们定义2,a,ab,abc可以理解,可是中文不是一个=3个吗(当前字符集规则),为什么插入张,张三都可以,而张三丰不可以呢,其实是因为MySQL的字符不同与c/c++里面的字符,这里的字符表示一个字符,不是一个字节,a是一个字符,张同样是一个字节~~

关于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字节)

char

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

用法与varchar相同,只不过你要2个字符的话,他一定给你两个字符,不会为你节省空间

varchar与char有什么不同


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

二、日期类型

类型 格式 范围 特点
DATE YYYY-MM-DD 1000-01-01 ~ 9999-12-31 仅日期
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 日期+时间,不受时区影响
TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC 存储 UTC 值,查询时按会话时区转换,自动更新(可设 CURRENT_TIMESTAMP

核心TIMESTAMP 有时区转换和自动更新特性,但范围小;DATETIME 范围大且与时区无关

下面为老版本的,这个版本不需要带选项就可以实现跟新功能

新版本就不支持了

三、String 类型(ENUM / SET)

类型 定义示例 取值 特点
ENUM ENUM('small','medium','large') 单选一个值 内部按整数存储(1,2,3...),排序按索引顺序,插入非法值会变成空字符串
SET SET('a','b','c','d') 多选任意组合,用逗号分隔 内部按位存储,最多 64 个成员,适合存储多个选项(如爱好、权限)

核心ENUM单选 字符串枚举;SET多选 集合。两者都限制可选值范围,比 VARCHAR 更紧凑但扩展性差

当然也可以用数字插入,不过需要注意的是

对于enum类型,下标即对应选项(从1开始,1对应男,2对应女,等等等)

对于set类型, 用bit位来对应选项(1对应1,2对应2,3对应1和2(因为3的比特位数 -> 0011),等等等)

四、enum与set的查找

我们学了最简单的查找方法

select * from [表名称] where [列名称]=[要查找的内容]

不过这种有局限性,只能查找一个,而且是严格查找,那么怎么查找多个,怎么范围查找呢

FIND_IN_SET(要查找的内容, 逗号分隔的字符串列表); 找到了返回对应下标,否则0

select * from [表名称] where FIND_IN_SET(要查找的内容, 逗号分隔的字符串列表);

情况 返回值 说明
查找成功 一个正整数 (1, 2, 3, ...) 返回查找内容在列表中的位置(从1开始计数)。
查找失败 0 当查找内容不存在于列表中时。
参数为 NULL NULL 如果任意一个参数NULL,函数都会返回 NULL
列表为空字符串 0 如果第二个参数是一个空字符串 "",结果也是

要是想实现多个查询,只需要and即可

好啦,这就是关于MySQL的数据类型啦,我们下篇博客再见~~

相关推荐
xuxie992 小时前
N27 数据库UI
linux·c#
Run_Teenage2 小时前
Linux:理解中断
linux·运维·服务器
深蓝海拓2 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十一)框架的进一步完善:UI的自动周期更新以及下行数据的生成和处理
网络·笔记·python·学习·ui·plc
北山有鸟2 小时前
解析 Linux 内核驱动中的“换行美学”
linux·运维·服务器
椰羊~王小美2 小时前
讲解“实时”是怎么实现的
学习
unDl IONA2 小时前
Linux安装RabbitMQ
linux·运维·rabbitmq
ok_hahaha2 小时前
AI从头开始-黑马LongGraph-简单学习
人工智能·学习·langchain·lang graph
米高梅狮子2 小时前
Ubuntu和Containerd
linux·运维·ubuntu
y = xⁿ2 小时前
MySQL常见八股:索引
数据库·mysql