MySQL 中可以为整数类型指定宽度,例如有如下表:
CREATE TABLE `tmp01160800` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `is_enable` tinyint(1) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `is_enable` (`is_enable`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
is_enable 字段显然只需要显示 0 或者 1,可能在应用逻辑中表示这个用户是否激活等,因此我们给其类型为 tinyint,并且指定其宽度 1。最初我以为 tinyint(1) 只能存储 0 到 9 的值,后来发现插入 10、99、125 等值都可以。实际上 tinyint 存储范围是 -128~127,刚好是 8 位 1 字节所能表示的整形范围,tinyint unsigned 的存储范围则是 0~255。所以指定整数宽度对应用来说意义不大,不管你指定多宽,实际上可以存储的范围是一样的。
下面文字来自《高性能 MySQL》一书:
MySQL 可以为整形类型指定宽度,例如INT(11),对大多数应用来说这是没有意义的:它不会限制值的合法范围,只是规定了 MySQL 的一些交互工具(例如 MySQL 命令行客户端)用来显示字符的个数。对于存储和计算来说,INT(1) 和 INT(20) 是相同的。