MySQL 字符串类型如下表所示。

类型 说明 N的含义 是否有字符集 最大长度
CHAR(N) 定长字符 字符 是 255
VARCHAR(N) 变长字符 字符 是 16384
BINARY(N) 定长二进制字节 字节 否 255
VARBINARY(N) 变长二进制字节 字节 否 16384
TINYBLOB(N) 二进制大对象 字节 否 256
BLOB(N) 二进制大对象 字节 否 16K
MEDIUMBLOB(N) 二进制大对象 字节 否 16M
LONGBLOB(N) 二进制大对象 字节 否 4G
TINYTEXT(N) 大对象 字节 是 256
TEXT(N) 大对象 字节 是 16K
MEDIUMTEXT(N) 大对象 字节 是 16M
LONGTEXT(N) 大对象 字节 是 4G


CHAR(N)

假设当前表的字符集的最大长度为 W, 则 CHAR(N) 的最大存储空间为 (N * W) Byte,假设使用 UTF-8(UTF-8 字符集占用的字节数是变长的,占用1 ~ 3个字节),则 CHAR(10) 可以最小存储10个字节的字符,最大存储30个字节的字符,其实是另一种意义上的 VARCHAR。

当存储的字符数小于 N 时,尾部使用空格填充,并且填充最小字节的空格。

参考姜承尧的笔记:MySQL学习笔记(Day008).html

上面的现象无法用统一的规则进行表述,但是官方文档给出的解释是,这样的安排是为了避免索引页的碎片:

https://dev.mysql.com/doc/refman/8.0/en/innodb-row-format.html
image.png

BLOB & TEXT

在 BLOB 和 TEXT 上创建索引时,必须指定索引前缀的长度。

  1. mysql> create table test_text(a int primary key, b text, key(b));
  2. ERROR 1170 (42000): BLOB/TEXT column 'b' used in key specification without a key length
  3. mysql> create table test_text(a int primary key, b text, key(b(64)));
  4. Query OK, 0 rows affected (0.13 sec)

BLOB 和 TEXT 列不能有默认值。

BLOB 和 TEXT 列排序时只使用该列的前 max_sort_length 个字节。

  1. mysql> select @@max_sort_length;
  2. +-------------------+
  3. | @@max_sort_length |
  4. +-------------------+
  5. | 1024 |
  6. +-------------------+
  7. 1 row in set (0.00 sec)

不建议在 MySQL 中存储大型的二进制数据,比如歌曲,视频。

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/geodiv 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。