tinyint 无需这设置大小,因为宽度为固定值 4(含一位符号位),取值范围是 -128 ~ 127 的整型数据。存储大小为1个字节,所以在建表的时候,无论是tinyint(100)还是tinyint(1),最终都是tinyint(4),故无需设置其宽度。
错误示范一:
-- 建表
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`num` tinyint(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入数据(禁止严格模式)
INSERT INTO `test`(`id`, `num`) VALUES (1, 128);
INSERT INTO `test`(`id`, `num`) VALUES (2, -129);
-- 结果
|--------|--------|
| id | num |
|--------|--------|
| 1 | 127 |
| 2 | -128 |
|--------|--------|
-- 结论:
在宽度 100 的情况下,插入 128 后,mysql自动将数据改为 127,宽度 100 是无效的
错误示范二:
-- 建表
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`num` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入数据(禁止严格模式)
INSERT INTO test`(`id`, `num`) VALUES (1, 128);
INSERT INTO `test`(`id`, `num`) VALUES (2, -129);
-- 结果
|--------|--------|
| id | num |
|--------|--------|
| 1 | 127 |
| 2 | -128 |
|--------|--------|
-- 结论:
在宽度 1 的情况下,插入 128 后,mysql自动将数据改为 127,宽度 1 是无效的
正确建表:
-- 建表1
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`num` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 或者
-- 建表2
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`num` tinyint DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果在mysql严格模式下,插入超过范围的数据,将不会插入成功,mysql会提示超过边界错误
ERROR 1264 (22003): Out of range value for column 'num' at row 1