
在数据库设计中,列的数据类型选择直接影响存储效率、查询性能及数据准确性。MySQL 提供了丰富的数据类型分类,涵盖数值、小数、字符串、日期时间及枚举集合等。下面将结合实际示例,逐一解析各类特性的使用场景与注意事项。
一、数值类型
数值类型主要用于存储整数或位信息。常见的包括 tinyint、bit 等,部分支持 unsigned 选项以扩展正数范围。
1.1 tinyint 类型
tinyint 是最小的整型,默认占用 1 字节。其有符号范围为 -128 到 127,无符号(unsigned)则为 0 到 255。
创建表时定义如下:
CREATE TABLE test_tinyint (
num TINYINT
);
插入极限值测试:
INSERT INTO test_tinyint VALUES (-128), (127);
若尝试插入超出范围的数值,例如 128,MySQL 会直接拦截并报错。加上 unsigned 属性后,负数将被拒绝,但正数上限提升至 255。
1.2 bit 类型
bit 类型用于存储二进制位数据。M 参数指定位数,默认为 1。该类型在显示时可能呈现为 ASCII 码对应的字符,而非直观的二进制或十进制数值。
示例:
CREATE TABLE test_bit (
a BIT(8)
);
插入数值 10 时,查询结果可能不显示预期数字,因为系统按 ASCII 码渲染。插入 65 则会显示大写字母 'A'。超出位宽表示的最大值同样会被拦截。
二、小数类型
涉及浮点数和定点数,主要区别在于精度处理方式。
2.1 float 类型
float 是浮点类型,需指定 M(总位数)和 d(小数位数)。例如 FLOAT(4,2) 表示总长 4 位,小数 2 位,范围约为 -99.99 到 99.99。
当插入数据超过指定小数位时,MySQL 会进行四舍五入处理。若四舍五入后仍超出总范围,则插入失败。添加 unsigned 后可限制为非负数。
2.2 decimal 类型
decimal 与 float 类似,但采用定点数存储,精度更高,适合金融等对精度敏感的场景。
对比实验显示,相同参数下 float 可能出现精度丢失,而 decimal 能完全保留原始数据。float 有效精度约 7 位,decimal 最大整数位可达 65 位,小数位最大 30 位。
三、字符串类型
字符串类型分为定长和变长两种,选择时需权衡空间与效率。
3.1 char 类型
char(L) 为定长字符串,L 代表字符数而非字节数。无论实际内容多短,都会占用 L 个字符的空间。单位字符在 utf8 编码下可能对应多个字节,但逻辑长度仍以字符计。
L 最大值为 255。超出范围或内容过长均会被拦截。
3.2 varchar 类型
varchar(L) 为变长字符串,仅存储实际内容及长度标识。总字节数受限于 65535,扣除长度记录开销后,实际可用空间取决于字符集编码。
在 utf8 编码下,一个汉字占 3 字节,因此 L 最大值约为 21844。若设为 21845 可能因长度字段占用额外字节而报错,通常建议预留余量。


