作为数据库,必然要存储很多信息。MySQL作为历史悠久的数据库,内部也有很多的数据类型。本期我们就来了解一下它们
目录
数值类型
数值类型表格
| 类型分类 | 具体类型 | 说明 | 取值范围(有符号) | 存储空间 | 示例 |
|---|---|---|---|---|---|
| 整数类型 | TINYINT |
很小的整数 | -128 ~ 127 | 1 字节 | age TINYINT |
SMALLINT |
较小的整数 | -32,768 ~ 32,767 | 2 字节 | count SMALLINT |
|
MEDIUMINT |
中等大小的整数 | -8,388,608 ~ 8,388,607 | 3 字节 | score MEDIUMINT |
|
INT / INTEGER |
标准整数 | -2,147,483,648 ~ 2,147,483,647 | 4 字节 | id INT |
|
BIGINT |
大整数 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 8 字节 | big_num BIGINT |
|
| 定点数 | DECIMAL(M,D) / NUMERIC |
精确小数(金额常用) | 取决于 M,D | 可变 | price DECIMAL(10,2) |
| 浮点数 | FLOAT |
单精度浮点数 | ±1.175E-38 ~ ±3.402E+38 | 4 字节 | weight FLOAT |
DOUBLE |
双精度浮点数 | ±2.225E-308 ~ ±1.798E+308 | 8 字节 | height DOUBLE |
|
| 位类型 | BIT(M) |
位字段值 | 1 ~ 64 位 | 约 (M+7)/8 字节 | flag BIT(1) |
tinyint
我们先创建了一个tinyint类型的表

接下来查看数据库

向表中插入数据

查询表中数据

但是要注意数据范围。在C/C++中如果超范围了会截断变量值,但是在MySQL中会直接拒绝并报错。这样是为了让数据库的值是合法的且可预期的

bit
sql
BIT(M) -- M 为 1 到 64,表示存储的位数
创建一个存bit的表
插入数据

浮点数
float/double
sql
FLOAT[(M,D)] -- 单精度浮点数,M 为总位数,D 为小数位数(可选)
DOUBLE[(M,D)] -- 双精度浮点数


MySQL中浮点数主要是四舍五入的

decimal
在 MySQL 中,DECIMAL 是一种定点数类型,用于精确存储和计算数值,特别适合货币等需要高精度的场景。
sql
DECIMAL(M,D) -- M 为总位数(精度),D 为小数位数(标度)
--M 最大 65,D 最大 30,且 D ≤ M
尽量避免decimal与浮点数整数直接计算,因为会导致decimal出现四舍五入

字符串类型
char
sql
char(L);
-- 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
创建一个限定3个字符的表并插入
MySQL中一个汉字是一个字符

varchar
sql
varchar(L);
--可变长度字符串,L表示字符长度,最大长度65535个字节
varchar是可变字符串

char和varchar
共同点
| 特性 | 说明 |
|---|---|
| 定义语法 | CHAR(M) 和 VARCHAR(M),其中 M 表示最大字符数(非字节数)。 |
| 字符集支持 | 两者都支持多种字符集(如 utf8mb4),实际存储字节数受字符集影响。 |
| 比较行为 | 默认情况下,比较(=、<> 等)时忽略尾部空格(符合 SQL 标准)。 |
| 最大长度 | CHAR 最大 255 字符,VARCHAR 最大 65535 字符(受行大小限制和字符集影响)。 |
| 允许空值 | 均可定义为 NULL 或 NOT NULL。 |
| 索引支持 | 均可创建索引,但 VARCHAR 更常用前缀索引。 |
区别
| 对比维度 | CHAR |
VARCHAR |
|---|---|---|
| 存储方式 | 固定长度,右侧填充空格 至 M 字符。 |
可变长度,存储实际字符数 + 1 或 2 字节长度前缀。 |
| 检索时尾部空格 | 默认移除 填充的空格(除非启用 PAD_CHAR_TO_FULL_LENGTH 模式)。 |
原样保留插入时的尾部空格。 |
| 存储效率 | 空间浪费于填充,适合长度固定的短字符串。 | 节省空间,适合长度变化大的字符串。 |
| 性能 | 更新时可能更稳定(长度固定,不易产生碎片)。 | 更新可能导致页分裂,但查询时更节省 I/O(数据更紧凑)。 |
| 最大长度 | 0--255 字符 | 0--65535 字符(实际受行大小限制) |
| 典型用法 | 状态码、性别、MD5 值等固定长度标识。 | 用户名、标题、地址等长度不固定的文本。 |
应用场景
| 场景 | 推荐类型 | 原因 |
|---|---|---|
| 固定长度标识(如国家代码、MD5、Y/N) | CHAR |
长度固定,无空间浪费,且避免因填充空格导致的意外行为。 |
| 长度变化大的文本(如评论、地址) | VARCHAR |
节省存储空间,减少 I/O,且尾部空格原样保留符合用户预期。 |
| 需要频繁更新的短字符串(如状态) | CHAR |
固定长度,更新时不易引发行迁移或页分裂。 |
| 前缀搜索(如 LIKE 'abc%') | VARCHAR |
索引更高效,且实际长度短时占用更少索引空间。 |
| 存储用户输入且可能包含尾部空格 | VARCHAR |
保留原始空格,避免因 CHAR 自动移除导致的语义丢失。 |
日期与时间
MySQL 支持以下核心日期时间类型:
| 类型 | 格式 | 范围(含) | 存储空间 | 精度 |
|---|---|---|---|---|
DATE |
YYYY-MM-DD |
1000-01-01 到 9999-12-31 |
3 字节 | 天 |
TIME |
HH:MM:SS 或 -HH:MM:SS |
-838:59:59 到 838:59:59 |
3 字节 | 秒(可选微秒) |
DATETIME |
YYYY-MM-DD HH:MM:SS |
1000-01-01 00:00:00 到 9999-12-31 23:59:59 |
5-8 字节 | 秒/微秒(取决于小数精度) |
TIMESTAMP |
YYYY-MM-DD HH:MM:SS |
1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC |
4 字节 | 秒/微秒 |
YEAR |
YYYY |
1901 到 2155(或 0000) |
1 字节 | 年 |


enum/set
enum
sql
CREATE TABLE t (
gender ENUM('male', 'female', 'other')
);
定义时列出所有允许的字符串值。
内部存储为整数索引 (1, 2, 3, ...),对应列表顺序。
'male' 存储为 1,'female' 存储为 2,'other' 存储为 3。
最多可定义 65,535 个枚举元素(实际受列定义长度限制)。
set
sql
CREATE TABLE t (
interests SET('reading', 'music', 'sports', 'travel')
);
定义时列出所有可能的选项。
内部存储为位图(bitmap),每个选项对应一个位(第 1 位对应第一个元素,第 2 位对应第二个,依此类推)。
最多可定义 64 个元素(因为 64 位整数限制)。
实际存储为 1、2、3、4 或 8 字节,取决于元素个数(最多 8 字节)。

本期内容先到这里。
封面图自取:
