在数据库设计中,列的数据类型选择直接决定了存储效率与查询性能。如果类型选错,轻则浪费空间,重则导致精度丢失或查询变慢。今天我们就来系统梳理一下 MySQL 中常见数据类型的特性与最佳实践。
数值类型
MySQL 的数值类型涵盖了整数、浮点数和定点数。理解它们的取值范围和存储机制是避免溢出和精度问题的关键。
tinyint 类型
tinyint 是最小的整数类型,占用 1 个字节。默认情况下它是有符号的,范围是 -128 到 127。我们可以通过测试来验证这一点:
CREATE TABLE test_tinyint (
num TINYINT
);
INSERT INTO test_tinyint VALUES (-128), (0), (127);
如果插入超出范围的数值,MySQL 会直接报错拦截。此外,tinyint 支持 unsigned 属性,去掉负数后,范围变为 0 到 255。这在存储状态码(如 0-1)或年龄等场景非常实用。
bit 类型
bit 类型用于存储位字段。定义时需要指定位数 M,例如 BIT(8)。如果不指定,默认为 1 位。
这里有个容易踩坑的地方:当查询 bit 字段时,客户端工具可能会将其显示为 ASCII 字符而非数字。比如插入十进制 65,显示出来可能是 'A'。这是因为底层存储的是二进制值,而显示层做了转换。
float 与 decimal 类型
处理小数时,float 和 decimal 是最常用的两种。它们都接受两个参数:总位数 M 和小数位数 d。
float 是浮点数,遵循 IEEE 754 标准,精度大约为 7 位。超过这个精度会出现误差。例如,存入 3.1415926 可能实际存成 3.141593。
decimal 是定点数,以字符串形式存储,精度极高,适合金融计算。它的最大整数位 m 可达 65,小数位 d 最大 30。
对比实验可以明显看出差异:
CREATE TABLE test_decimal (
f_val FLOAT(10,2),
d_val DECIMAL(10,2)
);
INSERT INTO test_decimal VALUES (1234567.89, 1234567.89);
SELECT * FROM test_decimal;
你会发现 float 列的值发生了微小变化,而 decimal 保持精确。因此,涉及金额务必使用 decimal。
字符串类型
字符串类型主要分为定长 char 和变长 varchar。虽然用法相似,但底层实现截然不同。
char 类型
char 是固定长度字符串。定义时指定的长度 L 就是占用的空间单位(字符数),而不是字节数。无论实际内容多短,都会占用 L 个字符的空间。例如 CHAR(10) 存 'a',也会占用 10 个字符的存储空间。这会导致空间浪费,但读取速度较快,因为偏移量固定。
注意:L 的最大值为 255。


