SQL中CHAR和VARCHAR的区别

CHAR和VARCHAR的区别

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

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

最大长度

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

有效长度

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

存储方式

  • 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

是否保留末尾空格

  • 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;

输出:

image

你可能感兴趣的:(SQL中CHAR和VARCHAR的区别)