Mysql 数据类型,如果列中的预期字符数约为 150K

Mysql datatype if expected number of characters in a column is around 150K

我在 MySql 中读到 varchar 允许(可变的)最大大小为 65KB。文本数据类型固定的最大大小为 65K。这意味着如果一列被声明为文本类型并且字段只有一个字符,它仍然会占用 65KB 的磁盘 space 并且类似地当加载到内存中时占用 65KB。这是正确的吗?

对于中等文本也是如此吗(即使该列只有一个字符也占用 16MB)?

假设我需要声明一个列,该列将被字符数在 150K 范围内的字符串占用,我不能使用文本但可以使用中等文本但想知道我是否会浪费很多磁盘 space/memory。什么是更好的方法来做到这一点。我能想到的一种方法是创建 3 行(将 150k 个字符分成 3 行,每行 50K),但是有没有更好的方法来做到这一点

不,可变长度数据类型,如 VARCHAR 和 TEXT 以及它们的同类,占用的空间没有它们的最大大小 space 多。它们只占用它们存储的字符串的长度,并且随着您存储不同长度的字符串,这可能会逐行变化。

它们每行也有 1 到 4 个字节来编码长度。例如,VARCHAR(255) 存储前有 1 个字节,因为 1 个字节可以编码最大 255 的任何长度。而 LONGTEXT 需要 4 个字节来编码长度,因为这是 LONGTEXT 的 4GB 最大长度所需要的。在字节编码长度之后,实际数据内容只需要与相应的字符串一样长。

比这要复杂一点,因为 InnoDB 将所有数据存储在统一大小的页面中(默认为 16KB),所以长字符串必须拆分为多个页面。

对于您预计典型数据为 150K 个字符的列,您应该使用 MEDIUMTEXT。 VARCHAR 和 TEXT 类型不能存储 150K 个字符。

variable-length 特性不适用于 CHAR 类型,它始终根据列的定义存储全长。我只对每行固定大小的字符串使用 CHAR,所以没有浪费 space.