设计数据库时,数据类型选错,轻则浪费空间,重则数据截断或精度丢失。比如用 INT 存手机号直接溢出,FLOAT 算金额越算越偏。这篇文章通过实际建表测试,把常见类型的坑和选择逻辑理一遍。
数值类型:范围与精度要卡准
整数是最常用的,关键看清范围和是否无符号。
| 类型 | 字节 | 有符号范围 | 无符号范围 | 适用场景 |
|---|---|---|---|---|
| BIT(M) | 1-8 | 1-64 位 | 同有符号 | 0/1 标识,位掩码 |
| TINYINT | 1 | -128~127 | 0~255 | 年龄、小范围状态 |
| SMALLINT | 2 | -32768~32767 | 0~65535 | 小计数 |
| INT | 4 | -2e9~2e9 | 0~4e9 | 普通计数、用户 ID |
| BIGINT | 8 | -9e18~9e18 | 0~1.8e19 | 大数值、手机号、雪花 ID |
UNSIGNED 用起来要小心。虽然能容纳更大的正数,但插入负数直接报错,且与有符号列混算时容易逻辑混乱。如果正数范围不够,直接换更大的整数类型更省心。
BIT 类型查出来是乱码。BIT(1) 存 0 或 1 没问题,但直接 SELECT 会显示成 ASCII 字符(或取决于客户端的十六进制串)。想要看到数字,得用 gender+0 或 CAST(gender AS UNSIGNED) 转一下。
CREATE TABLE tt5(gender bit(1));
INSERT INTO tt5 VALUES(0); -- 成功
INSERT INTO tt5 VALUES(1); -- 成功
INSERT INTO tt5 VALUES(2); -- Data too long
TINYINT 的边界
有符号 TINYINT 范围 -128127,无符号 0255,越界就报错。
CREATE TABLE test_tinyint1(age TINYINT);
INSERT INTO test_tinyint1 VALUES(127); -- OK
INSERT INTO test_tinyint1 VALUES();
test_tinyint1 ();
test_tinyint2(age TINYINT UNSIGNED);
test_tinyint2 ();
test_tinyint2 ();


