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。
