MySQL 数据类型详解:从数值到字符串的实战指南
MySQL 的数据类型体系庞大且分类明确,合理选择类型是构建高性能数据库的基础。下面我们将逐一梳理常见的数值、小数、字符串、日期时间以及枚举集合类型。
一、数值类型
数值类型涵盖了多种整数和浮点表示。以 INT 家族为例,不同长度对应不同的取值范围。我们以 TINYINT 为例进行演示。
1.1 TINYINT 类型
TINYINT 是有符号整数,默认范围为 -128 到 127。创建表并插入边界值测试,确认数据正常写入。若尝试插入超出范围的数值,MySQL 会直接拦截报错。
此外,INT 类型支持 UNSIGNED 属性。加上该属性后,TINYINT 变为无符号类型,范围调整为 0 到 255。同样,超出此范围的数据无法插入。其他 INT 变体(如 SMALLINT, MEDIUMINT, BIGINT)遵循相同的逻辑,区别仅在于存储空间和取值范围。
1.2 BIT 类型
BIT 类型用于存储二进制位数据。参数 M 指定位数,默认为 1。
当定义 BIT(8) 并插入数值 10 时,查询结果可能显示为空或特殊字符。这是因为 BIT 字段在显示时按 ASCII 码对应的字符处理,而非直接显示十进制数。例如插入 65,显示为大写字母 A。若插入数值超出比特位最大值(如 BIT(1) 插入 2),MySQL 同样会拦截。
二、小数类型
2.1 FLOAT 类型
FLOAT 是浮点数类型,定义时需指定总位数 M 和小数位数 d。例如 FLOAT(4,2) 表示总长 4 位,小数 2 位,范围约为 -99.99 到 99.99。
测试发现,即使输入的小数位数超过 d 设定(如输入三位小数),只要四舍五入后未超出 M 的范围,通常可以成功插入。但如果四舍五入后的值超出了整体范围(如变成 100.00),则会被拦截。
配合 UNSIGNED 属性后,FLOAT 仅允许非负数,范围变为 0 到上限。
2.2 DECIMAL 类型
DECIMAL 与 FLOAT 类似,但核心区别在于精度。FLOAT 存在精度损失,而 DECIMAL 是定点数,能精确存储。
对比实验显示,相同参数下,FLOAT 存储的值可能与原值有微小偏差,而 DECIMAL 完全一致。
FLOAT精度约为 7 位,超过则损失精度。DECIMAL整数最大位数M为 65,小数最大位数D为 30。省略时M默认为 10,D默认为 0。
涉及金额计算时,强烈建议使用 DECIMAL 以避免精度问题。
三、字符串类型
3.1 CHAR 类型
CHAR 是定长字符串。参数 L 指定字符长度,单位是字符而非字节。例如 CHAR(2) 最多存 2 个字符。
注意编码差异:在 UTF-8 下,一个汉字占 3 个字节,但 CHAR 计数仍按字符算。因此 CHAR(2) 存 "中国" 是合法的,占用 6 字节空间。L 的最大值为 255。


