首先,我们来创建一个测试表。
mysql> create table test (var1 boolean, var2 tinyint, var3 tinyint(8));
Query OK, 0 rows affected (0.01 sec)
mysql> show create table test;
+-------+--------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`var1` tinyint(1) DEFAULT NULL,
`var2` tinyint(4) DEFAULT NULL,
`var3` tinyint(8) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
可以看到,表中三个字段的数据类型分别为 tinyint(1)
、tinyint(4)
和 tinyint(8)
,那么它们之间有什么区别呢?
试着向表中添加一些数据看看。
mysql> insert into test values(0, 0, 0), (1, 1, 1), (100, 100, 100);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test;
+------+------+------+
| var1 | var2 | var3 |
+------+------+------+
| 0 | 0 | 0 |
| 1 | 1 | 1 |
| 100 | 100 | 100 |
+------+------+------+
3 rows in set (0.01 sec)
可以看到,并没有啥区别,实际情况是,这些定义的类型之间确实没有啥区别,从数据角度上来看,它们是完全一样的!!!
类型中的 size
值,也就是 M
的值,该值最大为 255
(试出来的),其作用其实是在展示时提示该值的长度。
但是,tinyint(1)
有点特殊,比如像 Connector/J 会将其当作 boolean
类型来处理,会将其值转换为 true
或者 false
(非0为真)。

这种特性可以通过设置连接参数 tinyInt1isBit=false
来取消。
参考:
网友评论