在实际开发中,数据库表结构设计往往决定了系统的性能上限。其中,数据类型的选择是最基础也最容易踩坑的环节。选错了类型,轻则浪费存储空间,重则导致精度丢失或查询变慢。下面结合实战经验,梳理一下 MySQL 常见数据类型的选型逻辑。
一、数值类型
数值类型是数据库中最常用的部分,主要分为整数和浮点数。
1. 整数与位类型
整数类型包括 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 等,区别在于占用字节数和取值范围。对于状态标记(如 0/1),TINYINT 足够且节省空间。
关于 bit 类型,它主要用于存储二进制位数据,但在实际业务中较少直接使用,通常用 tinyint(1) 替代布尔值。
2. 浮点类型 (float)
FLOAT(M,D) [UNSIGNED]:M 指定显示长度,D 指定小数位数,占用空间 4 个字节。
例如 FLOAT(4,2) 表示的范围是 -99.99~99.99。需要注意的是,MySQL 在保存 float 值时会进行四舍五入处理。

注意: float 类型存在精度问题,不适合存储金额等对精度要求极高的数据。
3. 定点数 (decimal)
DECIMAL(M,D) [UNSIGNED]:定点数 M 指定总长度,D 表示小数点的位数。
DECIMAL(5,2) 表示的范围是 -999.99999.99;若加上 UNSIGNED,则范围为 0999.99。
虽然 decimal 和 float 很像,但核心区别在于精度。float 表示的精度大约是 7 位有效数字,而 decimal 可以精确存储。整数最大位数 M 为 65,支持小数最大位数 D 是 30。如果 D 被省略,默认为 0;如果 M 被省略,默认是 10。
建议: 涉及金额、财务计算等场景,务必使用 DECIMAL,避免浮点数运算带来的误差。
二、字符串类型
字符串类型分为定长和变长两种,理解它们的底层机制有助于优化存储。
1. CHAR 类型
CHAR(L):固定长度字符串,L 是可以存储的长度,单位为字符,最大长度值为 255。
无论实际存入多少字符,CHAR 都会占用 L 个字符的空间。如果数据确定长度都一样,比如身份证、手机号、MD5 哈希值,就使用定长 CHAR。它的优势是效率高,因为直接开辟好对应的空间,无需额外记录长度。

2. VARCHAR 类型
VARCHAR(L):可变长度字符串,L 表示字符长度,最大长度 65535 个字节。
这里有个细节:VARCHAR 的实际长度限制和表的编码密切相关。VARCHAR 长度可以指定为 0 到 65535 之间的值,但有 1-3 个字节用于记录数据大小,所以有效字节数是 65532。
- 当表的编码是 UTF8 时,一个字符占用 3 个字节,VARCHAR(n) 的参数 n 最大值是 65532 / 3 = 21844。
- 如果编码是 GBK,一个字符占用 2 个字节,参数 n 最大是 65532 / 2 = 32766。
对比总结:
- 定长 (CHAR):磁盘空间比较浪费,但是效率高。适合长度固定的数据。
- 变长 (VARCHAR):磁盘空间比较节省,但是效率略低。适合长度变化大的数据,比如名字、地址。使用时要保证最长的能存进去。









