MySQL数据库中,tinyint(1) 和 tinyint 有什么区别
TINYINT(1)
和 TINYINT
的区别
在 MySQL 中,TINYINT(1)
和 TINYINT
本质上是相同的数据类型,但 TINYINT(1)
中的 (1) 实际上不会影响存储大小或取值范围。
1. TINYINT
及其取值范围
TINYINT
是 MySQL 中最小的整数类型,占用 1 个字节 (8 bit),可以存储以下数值:
- 有符号 (
SIGNED
):-128
到127
- 无符号 (
UNSIGNED
):0
到255
CREATE TABLE example (
col1 TINYINT, -- 默认可以存储 -128 到 127
col2 TINYINT(1), -- (1) 只是显示宽度,不影响存储
col3 TINYINT(3) -- (3) 也是显示宽度,不影响存储
);
2. TINYINT(1)
中的 (1)
代表什么?
- 在 MySQL 5.7 及以前,
TINYINT(1)
中的 (1) 只是显示宽度,和TINYINT(3)
、TINYINT(4)
类似,不会影响存储的数值范围。 - 从 MySQL 8.0 开始,数字类型的 (N) 宽度已被废弃,不再影响显示效果。
示例
CREATE TABLE test (
a TINYINT(1), -- (1) 不影响实际存储,只是以前用于格式化显示
b TINYINT(3)
);
在 MySQL 8.0 及以后,TINYINT(1)
和 TINYINT
没有任何区别,系统会忽略 (1)
,两者完全等效。
3. TINYINT(1)
主要用于布尔值
MySQL 没有真正的 BOOLEAN
类型,通常 TINYINT(1)
被用来存储布尔值(0
和 1
)。
TINYINT(1)
只是一个约定俗成的写法,实际上TINYINT
也一样能存0
和1
。- 你可以用
TINYINT(1)
表示is_active
这样的布尔字段,但TINYINT
也一样能满足需求。
CREATE TABLE users (
is_active TINYINT(1) DEFAULT 1 -- 其实等同于 TINYINT DEFAULT 1
);
4. 结论
类型 | 存储大小 | 取值范围(SIGNED ) | 取值范围(UNSIGNED ) | (N) 是否影响存储 |
---|---|---|---|---|
TINYINT | 1 字节 | -128 到 127 | 0 到 255 | ❌ 无影响 |
TINYINT(1) | 1 字节 | -128 到 127 | 0 到 255 | ❌ 无影响 |
最佳实践:
- 如果
TINYINT
仅用于存储布尔值,推荐写TINYINT(1)
,让语义更清晰。- 但从 MySQL 8.0 开始,
(1)
已经完全无意义,可以直接写TINYINT
。