MySQL 数据类型详解
数据库设计时,选择合适的字段类型直接影响存储效率与查询性能。很多开发者对 MySQL 数据类型的理解仅停留在表面,导致后期出现精度丢失或空间浪费。下面结合实战场景,梳理常用数据类型的核心特性与避坑指南。
一、数值类型
数值类型是数据库中最基础的部分,选错类型不仅浪费空间,还可能引发计算错误。
1. tinyint 与 signed/unsigned
tinyint 占用 1 个字节,有符号范围是 -128 到 127。如果业务只需要存储非负整数(如状态码),加上 unsigned 关键字可将上限提升至 255。
CREATE TABLE test_tinyint (num TINYINT);
INSERT INTO test_tinyint VALUES (-128, 0, 127);
若插入超出范围的数值,MySQL 会直接报错拦截。开启 unsigned 后,负数同样无法存入。
2. bit 类型
bit(M) 用于存储二进制位,M 为位数,默认值为 1。显示时它遵循 ASCII 码规则,这常让人困惑。
CREATE TABLE test_bit (a BIT(8));
INSERT INTO test_bit VALUES (65); -- 对应字符 'A'
插入 65 会显示为 'A',因为它是 ASCII 码值。超出 M 位能表示的最大值也会被拦截。
二、小数类型
浮点数和定点数的选择是经典难题,核心在于精度控制。
1. float 类型
float(M, d) 是浮点型,M 为总长度,d 为小数位。注意,MySQL 对浮点数处理较宽松,超出指定小数位时会四舍五入,但可能损失精度。
CREATE TABLE test_float (salary FLOAT(4,2));
-- 插入 99.999,实际存储为 100.00
当数值经四舍五入后仍超出范围(如 100.00 > 99.99),则插入失败。unsigned 可限制为非负数。
2. decimal 类型
decimal 是定点数,适合金融等高精度场景。相比 float,它能保证完全精确,无精度损失。
CREATE TABLE test_decimal (
f_val FLOAT(10,2),
d_val DECIMAL(10,2)
);
test_decimal (, );


