代码音符

varchar 的最大长度是多少?如何计算?( mysql 8.0 )

创建时间: 5-20 11:34

浏览: 55

打开 navicat ,新建一张表,创建主键 id ,类型为 varchar ,长度设为 1024 。navicat 报了一个错( mysql 8.0 ):

我们看到, InnoDB 引擎下主键默认被限制长度为 3072 bytes (3 * 1024),因为我使用的字符编码是 utf8mb4 ,每个字符占 4 个字节,故实际 varchar 主键的最大长度为:3072 ÷ 4 = 768 。

随后,我们在下面创建一个字段 content ,类型为 varchar ,长度为 65535 ,navicat 报了错:

navicat 提示我们 content 这个字段的长度最大为 16383 。这个大小的来源为: InnoDB 的单 Page 大小限制为 16k = 16 * 1024 = 65535 bytes 。而行的存储实际是从第二个字节开始,再加上 varchar 还需要前 2 个字节来保存长度,实际 bytes 应为 65535 - 1 - 2 = 65532 。由于使用的是 utf8mb4 编码每个字符占用 4 个字节,所以保存长度为 65532 ÷ 4 = 16383 。

我们填入 16383 到上述创建的 content 字段的长度上,保存得到了navicat 的报错:

噢,不对,我们之前有说过,InnoDB 的单 Page 大小限制为 16k ,那么单表内的每个字段长度都分享自这个最大字符长度 16383 的,所以 content 的字段长度我们应该减去 768 ,得到了: 16383 - 768 = 15615 。

实际能保存的 content 字段字符长度为 15614 ,少了个 1 个长度,暂不知是否那里遗漏了。

如果要保存长文本,就得需要 blob 、 text 等大文本字段了。其中, blob 等字段有 BLOB , MEDIUMBLOB , LONGBLOB 等,主要用于保存二进制数据,比如文件等。text 等字段有 TEXT , MEDIUMTEXT , LONGTEXT 等,主要用于保存长文本,比如文章等。

BLOB

TINYBLOB ( 最大 255 bytes ) 、 BLOB ( 最大 65KB ) 、 MEDIUMBLOB ( 最大 16MB ) 、 LONGBLOB ( 最大 4GB )

TEXT

TINYTEXT ( 最大 255 bytes ≈ 63 字符 ) 、 TEXT ( 最大 65,535 bytes ≈ 16,383 字符 ) 、 MEDIUMTEXT ( 最大 16,772,150 bytes ≈ 4,193,037 字符 ) 、 LONGTEXT ( 最大 4,294,967,295 bytes ≈ 1,073,741,823 字符 )

使用 BLOB 和 TEXT 会带来一些 MySQL 的性能问题,所以在使用上切记要多加考量。如果对数据长度无过大要求,更建议使用 varchar 来实现需求。

创建时间: 5-20 11:34

浏览: 55

*本文遵循 CC BY-NC-SA 许可协议。转载请注明出处!