被误解的tinyint(1)

简介: 被误解的tinyint(1)

缘起

你真的了解char(n),int(n),tiny(n)代表什么意思嘛。你是不是觉得tiny(1)就只能存一位数字(0->9)? 我直至昨天为止也是这样认为的,但是事实却有点出乎意料。纸上得来终觉浅,绝知此事要躬行啊。

  • 以(utf-8)为例,采用mysql数据库来验证。
    测试环境

mysql 5.7

phpadmin

charvarchar

  1. 首先创建数据表
-- 创建数据库时,设置数据库的编码方式 
-- 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;;
  1. 往数据库中插入数据验证
INSERT INTO `char_varchar_test`(`my_char`, `my_varchar`) VALUES 
('123','123'),
('abc','abc'),
('我爱你','我爱你'),
('我爱你','我爱你啊'),
('我爱你a','我爱你');

可以看到,无论是char还是varchar,最多都只能存放设置的字符(数字、字母、中文),一旦超过就会报错。

intint(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)。


相关文章
|
3天前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
6月前
|
算法
双指针算法
双指针算法
41 2
|
2月前
|
负载均衡 监控 算法
每个程序员都应该知道的 6 种负载均衡算法
每个程序员都应该知道的 6 种负载均衡算法
255 2
|
3月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
80 4
|
3月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
71 1
|
2月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
4月前
|
算法 搜索推荐 程序员
程序员常用算法详细讲解
每一种算法都有其适用场景,了解并熟悉这些常用算法的策略和实现,对于解决实际编程问题具有重要的意义。需要注意的是,理论知识的重要性虽然不言而喻,但真正的理解和掌握,还需要在实践中不断地尝试和错误,以达到深入理解的目的。
45 1
|
4月前
|
机器学习/深度学习 算法 搜索推荐
程序员必须掌握的算法
作为一名程序员,掌握一些重要的算法是必不可少的。算法是解决问题的方法和步骤,对于程序员来说,熟悉和掌握一些常见的算法可以提高编程能力,解决复杂的计算问题。与此同时,算法是计算机科学中的核心概念,对于程序员来说,掌握一些基本的算法是非常重要的。
53 1

热门文章

最新文章