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) 与 tiny(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自动左边补零,这才是限制显示长度。

总结

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.问题/补充

TBD

4.参考

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

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

后续补充

...


版权声明:本文为william_n原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。