【发布时间】:2014-03-01 13:50:13
【问题描述】:
我正在阅读有关 MySQL 数据类型大小的信息。我看到 VARCHAR 需要额外的 1/2 个字节,MEDIUMTEXT 需要额外的 3 个字节,LONGTEXT 需要额外的 4 个字节。这种 MySQL 行为的原因是什么?
【问题讨论】:
-
这个问题似乎是题外话,因为这在别处有所涉及
我正在阅读有关 MySQL 数据类型大小的信息。我看到 VARCHAR 需要额外的 1/2 个字节,MEDIUMTEXT 需要额外的 3 个字节,LONGTEXT 需要额外的 4 个字节。这种 MySQL 行为的原因是什么?
【问题讨论】:
当 MySQL(或任何数据库或计算机语言)存储可变长度字符串时,存储值基本上有两种方式:
'0')数据库(几乎?)总是使用长度编码。因此,当您将'ABC' 存储为可变长度字符串时,在数据库存储中它看起来像:
3 A B C
当你存储'A':
1 A
这样,MySQL 知道一个字符串何时结束,下一个字符串何时开始。不同类型的不同长度基于字符串的最大长度。因此,1 个字节可以保存从 0 到 255 的值。2 个字节可以保存从 0 到 65,535 的值等等。
当你使用正则字符表达式时,比如char(3),那么'ABC' 看起来像:
A B C
这占用三个字节/无论如何(取决于字符编码)。长度从表元数据中得知。
使用char(3),字符串'A'也占用三个槽:
A
---^space here
--------^space here
额外的两个被空格占据。对于长字符串,这通常会浪费大量空间,这就是为什么大多数字符串都存储为varchar 而不是char。
【讨论】:
varchar 有时使用一个字节,有时使用 2。char 不需要额外的字节,因为长度是已知的:字符串中的字符数存储在数据库中,长度为从表格的格式知道。