MySQL - tinyint(1)和int(1) 和 varchar(50)中数字的含义

1.应用场景

设计/修改数据表结构时,需要考虑和合理选择字段类型和长度。

2.学习/操作

1. 文档

小白学习MySQL - varchar类型字段为什么经常定义成255? - 云+社区 - 腾讯云

database design - MySQL - varchar length and performance - Database Administrators Stack Exchange

mysql - error 1118: row size too large. utf8 innodb - Database Administrators Stack Exchange

​​​​​​mysql varchar(255) 浅谈 - 简书

MySQL-没有必要的varchar(255)长度及存储汉字问题汇总_安迪爸爸-CSDN博客_mysql varchar最大长度255

2. 整理输出

2.1 整型数据类型 -- int(1)vs int(4) 与 tinyint(1) vs int(1)

1. 设定类型之后,存储是定长的,int(1) 和 int(4) 从本身长度还是存储方式上都是一样的。

MySQL里,int(1) 和 int(4)的区别: 就是显示的长度,

但是要设置一个参数:如果列制定了zerofill 就会用0填充显示,如 2 int(3)指定后就会显示为002


2. int 存储占4个字节, tinyint存储占1个字节存储类型【实际存储长度】决定了他们表示的数字范围不同。

int表示的数字范围是:从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字)。

tinyint 表示的范围是0-255之间的数字。


3. tinyint(1), 和tinyint(3)没什么区别,存123都能存的下,而如果tinyint(3) zerofill 的话,插入值 12,会存储012,zerofill自动左边补零,这才是限制显示长度。

插入

查询呢?

SELECT * FROM `localhost_practice`.`int_learning` WHERE `id` = '01' LIMIT 0,200;

SELECT * FROM `localhost_practice`.`int_learning` WHERE `id` = 1 LIMIT 0,200;
SELECT * FROM `localhost_practice`.`int_learning` WHERE `id` = '1' LIMIT 0,200;
SELECT * FROM `localhost_practice`.`int_learning` WHERE `id` = "1" LIMIT 0,200;

均可查询

总结

tinyint(1)  和 tinyint(3) 没区别,占用字节都是一位,存储范围是一样, 只是显示不同,实际存储数据没区别.

tinyint(3) zerofill, 当插入的数据少于3位的时候,左边自动补零,这才是限制显示长度.

int(1) 和 tinyint(1) , 够用的情况下, 优先选择tinyint(1),因为占字节少、节省空间。

tinyint(一个字节) , smallint (两个字节), MEDIUMINT(三个字节)  int(4个字节)  BIGINT(8个字节) 

这里数据类型决定了其都是阿拉伯数字。

截图如下:

关于fillzero --- 最新版本

MySQL版本

SELECT VERSION();

2.2 字符串类型 -- varchar(5) vs varchar(16) 

有没有觉得我们设置varchar长度的时候,很多时候都设置成255,这是为什么呢?

其实是因为在5.5.3版本之前,
InnoDB存储引擎的表索引的前缀长度最长是767字节(bytes),
MyIsam存储引擎的表索引的前缀长度最长是1000字节(bytes)。


所以如果字段要创建索引的话,长度就不能超过对应存储引擎的要求 767 bytes 或 1000 bytes,而如果中文按1个字符占用3个字节计算,总字节数刚好为765。【255*3=765, 还有两个字节用来记录长度,但是使用PHP框架的时候,有时候会出现varchar(255)的报错,因为编码方式采用的是utf8mb4, 则有些中文字符,特殊符号,emoj 就会占用四个字节,即191*4=764, 即varchar最多只能设置到varchar(191)

1071 - Specified key was too long; max key length is 767 bytes

要控制字节长度,就要说到字节编码了。

但是 varchar(5)  中的5 限制的是储存字符的个数, 字符不分贵贱(即中文、英文、数字...都是一样)

varchar(255) 是为了索引而设置,能够存储255个汉字。

varchar(255) 后来成为一些人使用的惯性,其实应根据实际业务场景设置长度。

varchar(n) 中的n在mysql 5.0.3之前表示n个字节,之后表示n个字符,按照实际使用的数据库字符编码集,占用不同字节数量,比如GBK、UTF8MB4等等。

验证:

首先varchar(5)与varchar(10)有区别吗?

mysql 版本:8.0

test_varchar table的数据结构

可以看到,写入williamning 出现如下报错:

1406 - Data too long for column 'name' at row 1

改为写入ning,同时count字段写入1

可以看到正常写入,同时count字段值,默认填充00,结果为001,因为字段类型为tiny(3),并且设置fillzero

写入long_name,value 为williamning

如此,正常写入~

可以知道,varchar(5) 与 varchar(16)中数字是为了限定字符的数量,还是应该根据自身业务进行设置的。

至于底层row的limit size则是所有字段value的实际存储限制,这里面涉及到几个限制,有些还是相互限制,而且根据不同mysql版本,限制有所不同。

后续补充

...

3.问题/补充

1. mysql 各种int的范围与使用场景

类型存储大小SIGNED 范围UNSIGNED 范围
TINYINT1 字节-128 ~ 1270 ~ 255
SMALLINT2 字节-32,768 ~ 32,7670 ~ 65,535
MEDIUMINT3 字节-8,388,608 ~ 8,388,6070 ~ 16,777,215
INT4 字节-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295
BIGINT8 字节-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,8070 ~ 18,446,744,073,709,551,615

使用建议

  • TINYINT​:适合存储状态码、布尔值(0/1)。
  • SMALLINT​:适合存储较小的数值,如年龄、小计数器。
  • INT​:最常用的整数类型,适合大多数 ID 和数值存储。
  • BIGINT​:适合超大数值,如分布式 ID(雪花算法)。
  • UNSIGNED​:如果数值不会为负数,使用 UNSIGNED 可以扩大正数范围。

4.参考

tinyint(1)和int(1)的区别_zcw4237256的博客-CSDN博客_tinyint和int有啥区别

database design - MySQL - varchar length and performance - Database Administrators Stack Exchange

后续补充

...

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值