理解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远程连接授权

在阿里云ECS上部署了LNMP环境,由于MySQL默认了只有localhost才能链接访问,所以必须先授权才能远程使用Navicat等客户端工具链接。
  • 改表法

    可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑使用mysql管理工具登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称”%”.
    修改完成命令行执行> flush privileges;即可立即生效。

  • 授权法

    A:你想mysql账户myuser使用密码mypassword从任何主机连接到mysql服务器的话,那就在mySQL命令行下输入:
    GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;若上面那条命令还没有奏效,那就使用下面的命令,一定成功!

    如果你想允许想mysql账户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码,那就在mySQL命令行下输入:
    GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;