https://blog.csdn.net/Constantdropping/article/details/99293092

一、首先,INT类型数据的字节大小是固定的4个字节,但是int(5)和int(11)区别在于,显示的数据位数一个是5位一个是11位,在开启zerofill(填充零)情况下,若int(5)存储的数字长度是小于5的则会在不足位数的前面补充0,但是如果int(5)中存储的数字长度大于5位的话,则按照实际存储的显示(数据大小在int类型的4个字节范围内即可),也就是说int(M)的M不代表数据的长度。

对于数值类型是定长的,也就是说,无论你存的数值是多少,多大或者多小,占用的字节大小都是固定的。例如,之前设置的int(1),虽然M值是1个字符,但是它所占用的空间大小永远都是4个字节的大小,换句话说就是,你可以存入有符号整型从-2 147 483 648到2 147 483 647包括这两个数的中间任何一个数。int(1)和int(11)占用的是4个字节,可以存入上述这些数,tinyint(1)和tinyint(4)占用的是1个字节,可以存入从-128到127的数,这也是为什么之前的一次试验,int(1)插入128成功,而tinyint(1)插入128却提示超出长度。

而varchar(20)中的20表示的是varchar数据的数据长度最大是20,超过则数据库不会存储。

VARCHAR列中的值为可变长字符串,长度可以指定为0到65535之间的值。VARCHAR的最大有效长度由最大行大小和使用的字符集确定。在MySQL 4.1之前的版本,VARCHAR(50)的“50”指的是50字节(bytes),如果存放UTF8汉字时,那么最多只能存放16个(每个汉字3字节);从MySQL 4.1版本开始,VARCHAR(50)的“50”指的是50字符(character),无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个。

总结:INT(M) 中M表示的不是数据的最大长度,只是数据宽度,并不影响存储多少位长度的数据;

varchar(M) 中M表示的是varchar类型数据在数据库中存储的最大长度,超过则数据库不会存储。

CHAR列的长度固定为创建表时声明的长度,长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

CHAR和VARCHAR类型声明的长度表示保存的最大字符数。例如,CHAR(30)可以占用30个字符。**对于MyISAM表,推荐CHAR类型;对于InnoDB表,推荐VARCHAR类型。**另外,在进行检索的时候,若列值的尾部含有空格,则CHAR列会删除其尾部的空格,而VARCHAR则会保留空格。

参考https://blog.csdn.net/aa\\\\_11\\\\_bb\\\\_22/article/details/80352996https://blog.csdn.net/qq\\\\_31648761/article/details/78270567https://blog.csdn.net/u014143369/article/details/60386547https://blog.csdn.net/qq\\\\_33412610/article/details/77962267