
在数据库设计中,列的数据类型选择直接决定了存储空间的占用和查询效率。虽然我们在建表时经常直接使用默认类型,但深入理解每种类型的特性、范围及精度限制,是避免数据丢失、提升性能的关键。
MySQL 的数据类型主要分为数值、字符串、日期时间以及枚举集合等几大类。下面我们将逐一拆解这些类型在实际开发中的表现。
一、数值类型
数值类型涵盖了整数、浮点数等。其中 INT 系列最为常用,它们都支持一个可选的 UNSIGNED 属性。
1.1 tinyint 类型
TINYINT 是最小的整数类型,有符号范围为 -128 到 127,无符号(UNSIGNED)则为 0 到 255。
CREATE TABLE test_tinyint (
num TINYINT
);
当我们尝试插入超出范围的数值时,MySQL 会直接报错拦截。例如插入 128 或 -129 都会失败。如果加上 UNSIGNED 修饰符,负数将无法存入,正数上限提升至 255。
虽然 SMALLINT、MEDIUMINT、INT、BIGINT 的位数不同,但使用逻辑与 TINYINT 一致,主要区别在于存储空间和取值范围。
1.2 bit 类型
BIT 类型用于存储位字段。定义时需指定位数 M,默认为 1。
CREATE TABLE test_bit (
a BIT(8)
);
这里有一个常见的误区:向 BIT 字段插入数字后,查询结果往往显示为乱码或不可见字符。这是因为 MySQL 默认按 ASCII 码显示二进制值。例如插入 65 会显示为 'A'。如果需要查看原始数值,可以使用 CAST() 函数转换。
同样,如果插入的数值超过了 M 位能表示的最大值,也会被拦截。
二、小数类型
处理金额或高精度计算时,小数类型的选择尤为重要。
2.1 float 类型
FLOAT 是单精度浮点数,定义时通常包含 M(总位数)和 D(小数位数)。
CREATE TABLE test_float (
salary FLOAT(4,2)
);
当设置 (4,2) 时,理论上范围是 -99.99 到 99.99。测试发现,如果插入超出此范围但四舍五入后在范围内的值,有时能成功,有时则不行,这取决于具体的舍入结果是否越界。此外,FLOAT 也支持 UNSIGNED,此时负数无法存入。
注意: FLOAT 存在精度损失问题。对于需要精确计算的场景(如金融),不建议使用。
2.2 decimal 类型
DECIMAL 是定点数类型,参数含义与 FLOAT 相同,但精度更高,适合存储货币。
test_decimal (
price (,),
amount (,)
);


