前面我们简绍了数值类型,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即可
