MySQL tinyint 类型详解

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

你可能感兴趣的:(MySQL tinyint 类型详解)