发布网友 发布时间:2024-10-03 02:06
共1个回答
热心网友 时间:2024-10-03 02:06
以下内容均基于 MySQL 8.2 及 InnoDB 环境测试。
探讨 varchar(255) 的含义,实际最大存储值并非普遍认为的 65535,而是 16383。实验表明,当尝试设置值超过此数字时,MySQL 会给出错误提示。
深入分析后发现,最大值为 16383 的原因在于字符集的设置。不同字符集占用存储空间不同,这影响了最大可存储的字符数量。例如,UTF-8mb4 和 UTF-8 的 Maxlen 分别为 4 和 3,对应的最大值分别为 65532 和 65535;GBK 的 Maxlen 为 2,对应的最大值为 65534。经过测试,最终证实最大值为 65533 字节。
进一步探究,发现是否允许值为 NULL 对最大值有影响。设置为不允许 NULL 时,最大值为 65533 字节;设置为允许 NULL 时,最大值为 65532 字节。这是由于 Innodb 需要额外使用一个字节存储 NULL 标记。
同时,表中字段数量也对最大值产生影响。在存在其他字段的情况下,最大可存储的字符数会相应减少。例如,在一个包含一个 int 类型字段的表中,原本可以存储 16383 个 UTF-8mb4 字符,现在只能存储 16382 个。这表明最大字节数为 65532,而非字符数量。
65535 字节并非仅限于 varchar 的最大值,而是包含其他开销的总行大小。对于 InnoDB 表,总行大小最大为 65535 字节,其中包括 varchar 字段长度的存储开销。
总结而言,varchar 能存储的字符数量取决于表字段的设置和是否允许 NULL。在不允许 NULL 且仅有一个 varchar 字段的情况下,最大字符数为 65533 / Maxlen。而 InnoDB 的设计规则要求,对于包含变长字段 varchar 的表,额外使用两个字节存储 varchar 的长度。这是因为在极端情况下,当表仅包含一个不允许为 NULL 的 varchar 字段时,该字段长度可能达到 65533 字节,至少需要两个字节来存储其长度。因此,实际上需要的字节数为 65536 字节,需要两个字节来存储长度信息。
热心网友 时间:2024-10-03 02:15
以下内容均基于 MySQL 8.2 及 InnoDB 环境测试。
探讨 varchar(255) 的含义,实际最大存储值并非普遍认为的 65535,而是 16383。实验表明,当尝试设置值超过此数字时,MySQL 会给出错误提示。
深入分析后发现,最大值为 16383 的原因在于字符集的设置。不同字符集占用存储空间不同,这影响了最大可存储的字符数量。例如,UTF-8mb4 和 UTF-8 的 Maxlen 分别为 4 和 3,对应的最大值分别为 65532 和 65535;GBK 的 Maxlen 为 2,对应的最大值为 65534。经过测试,最终证实最大值为 65533 字节。
进一步探究,发现是否允许值为 NULL 对最大值有影响。设置为不允许 NULL 时,最大值为 65533 字节;设置为允许 NULL 时,最大值为 65532 字节。这是由于 Innodb 需要额外使用一个字节存储 NULL 标记。
同时,表中字段数量也对最大值产生影响。在存在其他字段的情况下,最大可存储的字符数会相应减少。例如,在一个包含一个 int 类型字段的表中,原本可以存储 16383 个 UTF-8mb4 字符,现在只能存储 16382 个。这表明最大字节数为 65532,而非字符数量。
65535 字节并非仅限于 varchar 的最大值,而是包含其他开销的总行大小。对于 InnoDB 表,总行大小最大为 65535 字节,其中包括 varchar 字段长度的存储开销。
总结而言,varchar 能存储的字符数量取决于表字段的设置和是否允许 NULL。在不允许 NULL 且仅有一个 varchar 字段的情况下,最大字符数为 65533 / Maxlen。而 InnoDB 的设计规则要求,对于包含变长字段 varchar 的表,额外使用两个字节存储 varchar 的长度。这是因为在极端情况下,当表仅包含一个不允许为 NULL 的 varchar 字段时,该字段长度可能达到 65533 字节,至少需要两个字节来存储其长度。因此,实际上需要的字节数为 65536 字节,需要两个字节来存储长度信息。