char和varchar的区别

413 阅读2分钟

1.CHAR和VARCHAR的区别

CHAR和VARCHAR的主要区别有三方面:

  • 最大长度
  • 有效长度
  • 存储方式
  • 是否保留末尾空格

1.最大长度

  • CHAR的长度范围为0~255
  • VARCHAR的长度范围为0~65535

2.有效长度

  • CHAR的长度按照声明的长度保持不变
  • VARCHAR的长度是可变的,VARCHAR数据的有效长度应在声明时指定的长度范围内
  • 当插入的数据超出CHAR或VARCHAR声明的长度时,非严格模式会报警告并截断数据,严格模式下会报错
  • 当插入的数据超出CHAR或VARCHAR声明的长度,且当超出的部分仅为数据末尾空格时,无论何种模式下,CHAR型数据会截断数据且不提示任何信息,而VARCHAR型数据会截断数据但报警告

3.存储方式

  • CHAR型数据仅存储数据本身;

    VARCHAR型数据的存储方式为:1~2字节的长度前缀 + 数据;

  • CHAR型数据存储时,若数据的长度小于声明的长度,则会自动在该数据的右侧用空格补全长度;

    VARCHAR型数据存储时,若数据长度小于声明的长度,不会用空格补全;

以长度为4的CHAR和VARCHAR举例:

CHAR(4)所需存储空间VARCHAR(4)所需存储空间
''`' '`(存储了4个空格)4byte`''`1byte
'ab'`'ab '`(存储了字符ab及两个空格)4byte`'ab'`3byte
'abcd'`'abcd'`4byte`'abcd'`5byte
'abcdefg'`'abcd'`4byte`'abcd'`5byte

4.是否保留末尾空格

  • CHAR型数据检索时,会去除数据末尾的所有空格

  • VARCHAR型数据检索时,会保留数据末尾的所有空格

举例:

CREATE TABLE varchar_and_char (v VARCHAR(4), c CHAR(4));
INSERT INTO varchar_and_char VALUES ('ab  ', 'ab  ');
SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM varchar_and_char;

输出:

![](//upload-images.jianshu.io/upload_images/14805043-0e3d2edf709e5ec8.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/419/format/webp)

2.int(10)和int(11)的区别?

没有区别,就是宽度的区别吧,多出的宽度补0

所以,int(2)int(11)后的括号中的字符表示显示宽度,整数列的显示宽度与 MySQL 需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,int类型的字段能存储的数据上限依旧是2147483647(有符号型)和4294967295(无符号型)。

参考:1.blog.csdn.net/ZBylant/art…

2.www.jianshu.com/p/1e200a054…