被误解的tinyint
Posted 一腔诗意醉了酒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了被误解的tinyint相关的知识,希望对你有一定的参考价值。
缘起
你真的了解char(n),int(n),tiny(n)
代表什么意思嘛。你是不是觉得tiny(1)
就只能存一位数字(0->9)? 我直至昨天为止也是这样认为的,但是事实却有点出乎意料。纸上得来终觉浅,绝知此事要躬行啊。
- 以(
utf-8
)为例,采用mysql
数据库来验证。
测试环境
mysql 5.7
phpadmin
char
跟varchar
- 首先创建数据表
-- 创建数据库时,设置数据库的编码方式
-- CHARACTER SET:指定数据库采用的字符集,utf8不能写成utf-8
-- COLLATE:指定数据库字符集的排序规则,utf8的默认排序规则为utf8_general_ci(通过show character set查看)
DROP DATABASE IF EXISTS `TEST`;
CREATE DATABASE `TEST` CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `TEST`;
DROP TABLE IF EXISTS `CHAR_VARCHAR_TEST`;
CREATE TABLE `CHAR_VARCHAR_TEST` (
`id` INT UNSIGNED AUTO_INCREMENT,
`my_char` CHAR(3),
`my_varchar` VARCHAR(3),
PRIMARY KEY(`id`)
)CHARACTER SET utf8 COLLATE utf8_general_ci;;
- 往数据库中插入数据验证
INSERT INTO `char_varchar_test`(`my_char`, `my_varchar`) VALUES
('123','123'),
('abc','abc'),
('我爱你','我爱你'),
('我爱你','我爱你啊'),
('我爱你a','我爱你');
可以看到,无论是
char
还是varchar
,最多都只能存放设置的字符(数字、字母、中文),一旦超过就会报错。
int
跟 int(2)
,tinyint(2)
int
中的数字是为了填充长度空缺的长度。
整型的长度并不会限制存储的数字范围. 比如, int 和 int(3) 的存储范围都是 -2147483648 ~ 2147483647
, int unsigned 和 int(3) unsigned 的存储范围都是0 ~ 4294967295
.
“整型"的长度实际上可以理解为"显示长度”, 如果该字段开启 "Zerofill/补零"就能很明显地知道它的作用.
实战一下
- 有
ZEROFILL
DROP DATABASE IF EXISTS `TEST`;
CREATE DATABASE `TEST` CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `TEST`;
DROP TABLE IF EXISTS `INT_INTLENGTH`;
CREATE TABLE `INT_INTLENGTH` (
id INT UNSIGNED AUTO_INCREMENT,
i1 INT,
i2 INT(2) ZEROFILL,
i3 TINYINT ZEROFILL,
i4 TINYINT(2) ZEROFILL,
PRIMARY KEY (`id`)
) CHARACTER set utf8 COLLATE utf8_general_ci;
INSERT INTO `INT_INTLENGTH`(`i1`,`i2`,`i3`,`i4`) VALUES
(2,2,2,2),
(127,127,127,127),
(255,255,255,255),
(256,256,256,256),
(2147483647,2147483647,2147483647,2147483647),
(2147483648,2147483648,0,0),
(-2147483647,-2147483647,-1,-1),
(-2147483647,-1,-1,-1),
(0,0,0,0)
;
SELECT * FROM `INT_INTLENGTH`;
- 没有
ZEROFILL
DROP DATABASE IF EXISTS `TEST`;
CREATE DATABASE `TEST` CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `TEST`;
DROP TABLE IF EXISTS `INT_INTLENGTH`;
CREATE TABLE `INT_INTLENGTH` (
id INT UNSIGNED AUTO_INCREMENT,
i1 INT,
i2 INT(2) ,
i3 TINYINT ,
i4 TINYINT(2) ,
PRIMARY KEY (`id`)
) CHARACTER set utf8 COLLATE utf8_general_ci;
INSERT INTO `INT_INTLENGTH`(`i1`,`i2`,`i3`,`i4`) VALUES
(2,2,2,2),
(127,127,127,127),
(255,255,255,255),
(256,256,256,256),
(2147483647,2147483647,2147483647,2147483647),
(2147483648,2147483648,0,0),
(-2147483647,-2147483647,-1,-1),
(-2147483647,-1,-1,-1),
(0,0,0,0),
(-2147483648,-2147483648,-1,-1),
(-2147483649,-2147483649,0,0)
;
SELECT * FROM `INT_INTLENGTH`;
可以看到整型的长度并不影响整型的数据范围,他一般会配合ZEROFILL
使用。而ZEROFILL
又包含了UNSIGNED
,也就是说设置了ZEROFILL
的列的取值范围从0开始,如tinyint
设置zerofill
之后的取值范围为(0-255),超出范围的数据会被截断再存库(如-1
->0
, 256
->255
)。
以上是关于被误解的tinyint的主要内容,如果未能解决你的问题,请参考以下文章