乐趣区

关于mysql:MySQL-varchar和char使用场景记录

varchar 存储 MySQL 字符串类型数据。
本文基于 MySQL 5.7x

varchar 有以下特点:

  • MySQL 规定:一行数据的最大长度是 65535 字节,留神,是字节(byte),text、blob 等大字段类型除外。
  • varchar 的存储须要独自记录其长度,是在列之外占用的空间,但包含在每行总字节数限度内。
  • 占用空间和应用字符集相干

    • gbk(每字符占用 2 字节)
    • utf8(每字符占用 3 字节)
    • utf8mb4(每字符占用 4 字节)

为什么是 varchar(255)?

以 varchar(255)为例,这里的 255 示意字符数,假如字符集是 utf8,那么存储汉字占用的字节数是 255*3=765。那么为什么咱们看到有很多状况数据库里的 varchar 字段长度是 255 呢?

每个业务场景可能有特定的起因,然而设置为 255 有一些长处:

  • 在 utf8 字符集下,每个字符占 3 字节。
  • mysql innodb 引擎的每个索引列长度限度为 767 字节(bytes),255*3=765,255 恰好是不超过索引长度限度的最大长度。
  • 节俭 1byte 空间。varchar 字段须要独自记录其长度,1byte(8bit)无符号可示意的最大数是 2^8-1=255,如果超过 255(小于 512)则须要多申请 1byte 来记录字段长度。

该用 char 还是 varchar?

char:定长字符串
varchar:可变长字符串
char 和 varchar 区别,以 char(32) 和 varchar(32)举例:

char(32) varchar(32)
占用空间 固定 32 字符(如果数据长度不够 32 将用空格补齐) 追随理论存储内容长度,但不超过 32
空格解决 检索时会去掉尾部空格(数据自身有空白符也会被去掉) 不会对空格解决
是否记录字段长度 是。额定拿出空间记录字段数据长度(字符数)
实用场景 存储的数据长度基本一致,不须要空格,eg 手机号、UUID、明码加密后的密文 数据长度不肯定,长度范畴变动较大的场景
退出移动版