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 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。