理解MySQL的CHAR和VARCHAR的区别

之前一直没认真研究过MySQL的CHAR和VARCHAR之间有什么区别,只是模糊的认为,CHAR比VARCHAR字符长度短一些。
查阅了一下MySQL的官方文档,有了一些认识。

原文内容如下:

The CHAR and VARCHAR types are similar, but differ in the way they are stored and retrieved. They also differ in maximum length and in whether trailing spaces are retained.

The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters.

The length of a CHAR column is fixed to the length that you declare when you create the table. The length can be any value from 0 to 255. When CHAR values are stored, they are right-padded with spaces to the specified length. When CHAR values are retrieved, trailing spaces are removed unless the PAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.

Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535. The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used. See Section C.10.4, “Limits on Table Column Count and Row Size”.

其实翻译过来大意就是这样:

  1. 对于CHAR,字符长度在0-255之间,不足的长度将会以空格补齐,但在检索的时候,会删除补齐的空格。例如:char name(4),插入字符'''a'或者'abcd'都是占用4bytes。
  2. 对于VARCHAR,字符长度在0-65,535之间,有效的最大字符长度取决于此列最大行的长度,在各个列之间,最大有效长度取65,535 。同时,不同字符集也影响存储长度。其存储的内容不足长度不会以空格补齐。在符合标准的SQL中,尾部的空格在存储和检索时会被保留。例如:char name(4),插入字符'''a'或者'abcd',其长度分别为1,2,5byes 。

其次,如果未启用SQL严格模式,当CHAR或VARCHAR列超过列的最大长度,该值将被截​​断,以适应字段长度并产生一个警告。启用严格模式后,对于非空格字符截断时,会产生一个错误,并且不会真正插入值。

存储长度的差异如下图:

char-varchar-difference
char-varchar-difference

如果给定的值被存储到CHAR(4)和VARCHAR(4)列,从列中检索到的值并不总是相同,因为尾随空格从CHAR列检索时除去。例如:

char-varchar-spaces-select
char和varchar在检索时对于尾部空格的差异
char-varchar-spaces-like
LIKE检索方式会被尾部空格影响

所有MySQL的排序规则是PADSPACE类型的。这意味着所有CHAR,VARCHAR和TEXT值在MySQL中是不考虑任何尾随空格进行比较。
但是LIKE除外。
这些适用于所有的MySQL版本,而不受服务器的SQL模式。

官方文档原文地址:
https://dev.mysql.com/doc/refman/5.7/en/char.html

“理解MySQL的CHAR和VARCHAR的区别”的2个回复

发表评论

电子邮件地址不会被公开。