MySQL 数据类型详解:选型策略与常见误区
在数据库设计中,数据类型的选择往往被忽视,但一旦选错,轻则浪费存储空间,重则导致精度丢失或查询性能下降。作为资深开发者,我们在实际项目中需要对这些类型有清晰的认识。
数值类型
MySQL 的数值类型主要分为整数和浮点数两大类。
整数与位类型
对于 BIT 类型,它主要用于存储二进制位数据(0 或 1)。虽然功能上支持,但在业务逻辑中较少直接使用,除非涉及底层标志位处理。
浮点型与定点型
FLOAT(M,D) 用于存储单精度浮点数。M 指定显示长度,D 指定小数位数,通常占用 4 个字节。
需要注意的是,FLOAT 存在精度问题。例如 FLOAT(4,2) 表示范围是 -99.99 到 99.99,MySQL 在保存值时会进行四舍五入。由于 IEEE 754 标准的限制,FLOAT 的精度大约只有 7 位有效数字,不适合对精度要求极高的场景。
DECIMAL(M,D)
这是定点数类型,M 指定总长度,D 指定小数点后的位数。DECIMAL(5,2) 的范围是 -999.99 到 999.99,若加上 UNSIGNED 则为 0 到 999.99。
DECIMAL 和 FLOAT 最大的区别在于精度。DECIMAL 以字符串形式存储,能精确表示小数,最大整数位 M 为 65,最大小数位 D 为 30。如果省略 D,默认为 0;省略 M,默认为 10。强烈建议在涉及金额、财务等高精度计算时使用 DECIMAL。
字符串类型
CHAR 与 VARCHAR
CHAR(L) 固定长度字符串,L 为字符长度,最大 255。无论实际内容多长,都会占用 L 个字符的空间。适合存储身份证、手机号、MD5 哈希值等长度固定的数据。定长空间分配直接,读取效率高,但空间利用率可能较低。
VARCHAR(L) 可变长度字符串,L 为字符长度上限,最大 65535 字节。实际存储时,除了数据本身,还会额外占用 1-3 字节记录长度。因此有效字节数为 65532。
关于 VARCHAR 的长度限制,它与表的编码密切相关:
- UTF8 编码下,一个字符占 3 字节,所以 n 最大值约为 65532/3 = 21844。
- GBK 编码下,一个字符占 2 字节,所以 n 最大值约为 65532/2 = 32766。
选型建议:如果数据长度确定且一致(如状态码),用 CHAR;如果长度变化大(如用户名、地址),用 VARCHAR。变长类型节省空间,但读写效率略低于定长。
日期和时间类型
- DATE:格式 'yyyy-mm-dd',占用 3 字节。
- DATETIME:格式 'yyyy-mm-dd HH:ii:ss',范围从 1000 年到 9999 年,占用 8 字节。
- TIMESTAMP:时间戳,从 1970-01-01 开始,格式同 DATETIME,占用 4 字节。注意 TIMESTAMP 受时区影响较大,而 DATETIME 不受时区影响。
修改表中变量值的示例如下:
UPDATE table_name SET column_name = value WHERE condition;
枚举 (ENUM) 和集合 (SET)
ENUM
属于'单选'类型。定义时提供若干选项,如 ENUM('option1', 'option2')。实际存储的是对应的数字索引(1, 2, ...),最多支持 65535 个选项。出于可读性考虑,不建议直接插入数字编号。
SET 属于'多选'类型。如 。一个单元格可存储多个值,内部同样以数字位图存储(1, 2, 4, 8...),最多支持 64 个选项。


