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
BLOB & TEXT
在 BLOB 和 TEXT 上创建索引时,必须指定索引前缀的长度。
mysql> create table test_text(a int primary key, b text, key(b));
ERROR 1170 (42000): BLOB/TEXT column 'b' used in key specification without a key length
mysql> create table test_text(a int primary key, b text, key(b(64)));
Query OK, 0 rows affected (0.13 sec)
BLOB 和 TEXT 列不能有默认值。
BLOB 和 TEXT 列排序时只使用该列的前 max_sort_length 个字节。
mysql> select @@max_sort_length;
+-------------------+
| @@max_sort_length |
+-------------------+
| 1024 |
+-------------------+
1 row in set (0.00 sec)
不建议在 MySQL 中存储大型的二进制数据,比如歌曲,视频。
作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/geodiv 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。