数据类型
整数类型
类型 | 字节 | 范围 (有符号) | 范围 (无符号) | 应用场景 |
---|---|---|---|---|
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 性别、状态位、布尔值 |
SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 | 年龄、年份、地区编号 |
MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | 大一点的 ID 编号 |
INT / INTEGER | 4 | -21亿 ~ 21亿 | 0 ~ 42亿 | 最常用 ID、自增主键 |
BIGINT | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 | 金额、大用户量 ID |
👉 注意
- 可以加
UNSIGNED
让范围翻倍(去掉负数部分)。 INT(11)
中的数字 11 不是长度,只是 显示宽度(已废弃)。
INT(M)
的含义:
INT
是整数类型,固定占用 4 个字节。INT(11)
中的(11)
并不是表示该整数可以存储的最大位数,也不是长度。- 它本质上是 显示宽度(display width),用于
ZEROFILL
时控制输出格式。
CREATE TABLE test_width (
id INT(11) ZEROFILL,
score INT(5) ZEROFILL
);
INSERT INTO test_width (id, score) VALUES (1, 45);
SELECT * FROM test_width;
结果为;
id | score |
---|---|
00000000001 | 00045 |
- 可以看到,
INT(11)
的意思是显示 11 位宽度,不足的左侧用 0 填充(因为用了ZEROFILL
)。 - 如果没有
ZEROFILL
,INT(11)
输出和普通INT
一样,没有区别
注意事项
- 不影响存储范围
INT
占用 4 字节,范围-2147483648 ~ 2147483647
(有符号)(11)
不会改变存储大 小或范围
- 已废弃
- 从 MySQL 8.0.17 开始,
INT(M)
的显示宽度功能已经 废弃,即使写了(11)
也没有效果。 - 推荐直接写
INT
,如果需要格式化输出,用LPAD()
或应用层处理。
- 从 MySQL 8.0.17 开始,
bit类型
BIT(M)
表示存储 M 位二进制数,M 最大 64。
存储布尔值或标志位:
CREATE TABLE flags (
id INT,
is_active BIT(1), -- 0 或 1
permissions BIT(4) -- 例如 1010
);
-- 二进制插入表示 b'1010' 二进制表示
INSERT INTO bit_test (flags) VALUES (b'1010'), (b'0110');
-- 使用十进制表示
INSERT INTO bit_test (flags) VALUES (10); -- 10 的二进制就是 1010
查询显示问题
-- 默认显示
SELECT * FROM bit_test;
-- 结果可能会显示为 二进制字符或乱码
-- MySQL 将 BIT 类型存储为 二进制字符串,查询时如果客户端使用字符集显示,会显示乱码
转为可读整数
-- 使用 +0 或 BIN()、CAST() 显示
-- 转十进制
SELECT flags+0 AS flags_dec FROM bit_test;
-- 转二进制字符串
SELECT BIN(flags+0) AS flags_bin FROM bit_test;
flags_dec | flags_bin |
---|---|
10 | 1010 |
6 | 0110 |
小数类型
类型 |
---|