int(M)、char(M) 、varchar(M)的用法

文章目录

  • MySQL中int、char、varchar的一般用法
  • 1、int (M)
  • 2、varchar(M)
  • 3、char(M)
  • 4、char(M) 和varchar(M)的区别
    • 4.1 区别1:定长和变长
    • 4.2 区别2:存储容量上
    • 4.3 区别3:在展示上
    • 4.4 区别4:在使用场景上
    • 4.5 区别5:在书写场景上
    • 4.6 区别汇总

MySQL中int、char、varchar的一般用法

1、int (M)

在MySQL中表中创建一个int类型的列,会发现有默认的 int(11),其中11表示此时int类型的最大长度,其中第一位表示符号+或者-,后面十位表示数字,因为10亿级别的位数正好是10位,

数值类型中的int 范围:(-2^31- 1 至 2 ^31-1)即(-2147483648,2147483647)
1)默认为int(11),其中的11只是指示显示长度,并不表示存储长度。
2)实际上数据类型括号内的数字不管是多少,所占的存储空间都固定的。
3)后面的数字,不代表占用空间容量。而代表最小显示位数
4)当输入的值的大小超出范围,则会存储为范围最大值

int所能设置的M长度范围是0~255。

  • 当输入M为0,或者不设置M的值的时候,会自动设置为11。
  • 当输入的数值是大于255的时候,会提示最大为255。

实际上与设置多少是没有区别的,效果和int(11)是一摸一样的。如设置一个int(1),本以为只能存储0~9,其实不然,他可以存储最多11位数字。+ / - 符号占一位,数据存储的范围是-2147483648 ~ 2147483647。

那么int后面指定的数到底是什么作用呢,只有在加入zerofill (0填充约束) 的时候,才能看出效果。如果int设置为int(4),当存储1的时候,那么展示的就是0001。
由此看出结论,int后面代表的是宽度。实际占用空间永远为4字节。

int(M)、char(M) 、varchar(M)的用法_第1张图片
int(M)、char(M) 、varchar(M)的用法_第2张图片
int(M)、char(M) 、varchar(M)的用法_第3张图片

2、varchar(M)

MySQL 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
MySQL 5.0版本以上,varchar(20),20表示的是长度,即指20个字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 。

varchar(M), 在MySQL 5.0版本之后,M表示的是字符的个数,根据编码的不同,存储字符的个数也是不同的

  • 字符类型若为GBK,每个字符最多占2个字节,最大长度不能超过32766【32766*2=65532字节】;
    虽然一个英文字符实际占用一个字节,但是GBK定义字段时是默认以每个字符最大为2个字节来进行计算的,所以最大为varchar(32766)

  • (65535-1-2)/2= 32766。减1的原因是实际行存储从第二个字节开始;减2的原因是varchar头部的2个字节表示长度;除2的原因是字符编码是GBK

  • 字符类型若为UTF8,每个字符最多占3个字节,最大长度不能超过21844【21844*3=65532字节】
    虽然一个英文字符实际占用一个字节,但是utf-8定义字段时是默认以每个字符最大为3个字节来进行计算的,所以最大为varchar(21844)

  • (65535-1-2)/3= 21844。减1的原因是实际行存储从第二个字节开始;减2的原因是varchar头部的2个字节表示长度;除3的原因是字符编码是UTF8

3、char(M)

char(M) 的M是字符长度。最长为255个字符
一个多字节字符算作一个单字符,如1个汉字、1个数字,都被当成1个字符

4、char(M) 和varchar(M)的区别

char(M) varchar(M),M代表能存储的最多字符数,
1个英文、1个数字、1个中文都代表一个字符

4.1 区别1:定长和变长

在MySQL中,char和varchar都是用来存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型。

char有固定的的长度,所以在处理速度上要比varchar快很多,但是也相对更耗费存储空间,在速度上有要求的可以使用char类型

  • char类型是规定多少字长则必须存储多少字长,超过的字段则只能截取出对应的长度进行存储,相对于要去字长长度不够的字段则用空格补齐。
  • varchar类型则是只要在规定字长之内,有多少就存多少,无需补齐;超出部分和char一样,舍去即可

4.2 区别2:存储容量上

  • 对于char类型来说,最多只能存放的字符个数为255,和编码无关
    • 取值范围1-255字节,存储与编码无关,每个符号占用一个字节,最多存储255个字符
  • varchar最多能存放的字符由最大有效长度由最大行大小和使用的字符集来确定。
    • 取值范围0-65535字节,UTF8编码下数字、字母占用1字节,中文占用3字节,但是在存储时,都是以3字节来计算的。
    • 如UTF8编码下,最多存放21844个字符
    • (65535-1-2)/3 = 21844

int(M)、char(M) 、varchar(M)的用法_第4张图片

int(M)、char(M) 、varchar(M)的用法_第5张图片

4.3 区别3:在展示上

  • char会将保存值后的空格全部截取掉,
  • varchar则会保留。

4.4 区别4:在使用场景上

  • 当字段长度固定时,可以使用char类型以提高效率,如身份证号码(固定18号)等字段。
  • 当字段长度不固定时,可以使用varchar类型,兼容性更强

4.5 区别5:在书写场景上

char(M) M可以省略,默认为1;varchar(M),M不可以省略

4.6 区别汇总

对比 char varchar
最大长度 255字符 括号中最大的字符数通过编码来算,不超过行65535个字节
是否定长 定长,不足的部分用隐藏空格填充 不定长,保留实际字符
空间使用 可能浪费 更加节省
查找效率

备注:
个人见解,希望能给大家带来帮助,在写的过程中发现很多知识盲区,
总结一条,在经常使用的技术点的范畴下,尽可能多了解底层的一些知识点,对于自己的是有很大帮助的,共勉!!!

你可能感兴趣的:(MySQL,mysql)