MySQL 核心数据类型深度解析
在数据库设计中,合理选择数据类型是保障性能与数据一致性的基石。MySQL 提供了丰富的类型体系,涵盖数值、字符串、日期时间及枚举集合等。本文将结合实际示例,深入剖析各类特性的适用场景。
一、数值类型
数值类型主要用于存储数字信息。常见的包括整型、浮点型和定点型。
1.1 Tinyint 与 Bit
tinyint 是最小的整型,默认占用 1 字节。其取值范围受 unsigned 属性影响:
- 有符号:-128 ~ 127
- 无符号:0 ~ 255
超出范围的插入操作会被 MySQL 拦截并报错。例如,尝试向 tinyint(1) 插入 128,系统会直接拒绝。
bit 类型用于存储二进制位数据。定义时指定位数 M(如 BIT(8)),若不指定默认为 1。查询时需注意,bit 字段可能以 ASCII 码形式显示,导致数值 65 显示为字符 'A'。
CREATE TABLE test_bit (a BIT(8));
INSERT INTO test_bit VALUES (65);
SELECT * FROM test_bit;
1.2 Float 与 Decimal
浮点数类型 float 和定点数类型 decimal 常用于金额或高精度计算。
- Float:近似值存储,存在精度损失风险。M 表示总位数,d 表示小数位数。若输入值超过精度限制,MySQL 会进行四舍五入处理。
- Decimal:精确存储,适合金融场景。最大整数位 m 为 65,小数位 d 最大为 30。
注意:float 的精度约为 7 位,超过此范围可能出现误差;而 decimal 能完全保留输入值。
二、字符串类型
字符串类型分为定长与变长两种,理解其底层机制对空间优化至关重要。
2.1 Char 与 Varchar
- Char(L):固定长度。无论实际内容多短,都会占用 L 个字符的空间。单位是字符而非字节。适用于长度固定的数据,如身份证号、MD5 哈希值。
- Varchar(L):可变长度。仅占用实际内容加 1~3 字节的长度空间。L 的最大值受表编码影响(utf8 下约为 21844)。适用于长度不确定的文本,如姓名、地址。
对比建议:
- 数据长度固定且差异小,优先用
char,效率更高。 - 数据长度变化大,使用
varchar,节省空间。
2.2 编码影响
在 utf8mb4 编码下,一个汉字占 3 个字节。因此 varchar(21844) 在 utf8 中最多存储约 21844 个字符,但需预留 1~3 字节记录长度开销。
三、日期和时间类型
MySQL 提供三种主要时间类型,各有侧重:
- Date:格式 ,占 3 字节,仅存储日期。


