我想在MySQL表的一列中保存一个字符串。有时它是 2 个字符,有时甚至更大。 50000 个字符。使用 varchar(50000) 是个好主意吗?如果我只在列中保存 2 个字符,它会使用全部 4998 个字节还是仅使用 2 个字节?
如数据类型存储要求中所述:
字符串类型的存储要求
在下表中,
表示声明的列长度(以字符为单位)(对于非二进制字符串类型)和字节(对于二进制字符串类型)。M
表示给定字符串值的实际长度(以字节为单位)。L
如果列值需要 0 – 255 字节,则
数据类型 需要存储 CHAR(M)
×M
字节,0 <=w
<= 255, whereM
是字符集中的字符w
BINARY(M)
字节,0 <=M
<= 255M
,VARCHAR(M)
VARBINARY(M)
+ 1 个字节;如果值可能需要超过 255 个字节,则L
+ 2 个字节L
、TINYBLOB
TINYTEXT
+ 1 个字节,其中L
< 28L
、BLOB
TEXT
+ 2 个字节,其中L
< 216L
、MEDIUMBLOB
MEDIUMTEXT
+ 3 个字节,其中L
< 224L
、LONGBLOB
LONGTEXT
+ 4 个字节,其中L
< 232L
ENUM('value1','value2',...)
1 或 2 个字节,取决于枚举值的数量(最多 65,535 个值) SET('value1','value2',...)
1、2、3、4 或 8 字节,取决于集合成员的数量(最多 64 个成员) 变长字符串类型使用长度前缀加数据来存储。根据数据类型,长度前缀需要 1 到 4 个字节,前缀的值为
(字符串的字节长度)。例如,存储L
值需要MEDIUMTEXT
字节来存储该值加上三个字节来存储该值的长度。L
、CHAR
或VARCHAR
列值的字节数,您必须考虑用于该列的字符集以及该值是否包含多字节字符。特别是,在使用TEXT
(或utf8
)Unicode 字符集时,您必须记住,并非所有字符都使用相同的字节数,每个字符最多可能需要三(四)个字节。有关不同类别utf8mb4
或utf8
字符使用的存储的详细信息,请参阅第 10.1.10 节“Unicode 支持”。utf8mb4
、VARCHAR
以及VARBINARY
和BLOB
类型是可变长度类型。对于每个因素,存储要求取决于以下因素:TEXT
列值的实际长度
列的最大可能长度
列使用的字符集,因为有些字符集包含多字节字符
例如,
列可以容纳最大长度为255个字符的字符串。假设列使用VARCHAR(255)
字符集(每个字符一个字节),那么实际需要的存储就是字符串的长度(latin1
),加上一个字节来记录字符串的长度。对于字符串L
,'abcd'
为4,存储要求为5个字节。如果同一列声明为使用L
双字节字符集,则存储要求为 10 个字节:ucs2
的长度为 8 个字节,并且该列需要两个字节来存储长度,因为最大长度更大大于 255(最多 510 字节)。'abcd'
因此,回答你的问题:
如果我只在列中保存 2 个字符,它会使用全部 4998 个字节还是仅使用 2 个字节?
存储 2 个字符字符串的
VARCHAR(50000)
列需要 L
+2 个字节,其中 L
是在列字符中编码该 2 个字符字符串所需的字节数设置:它肯定不会使用“所有4998字节”。
MySQL 中有这种 varchar 数据类型,用于动态内存分配数据,即可变长度。因此,如果您保存 2 个字符,它将仅占用 2 个字符的内存空间,如果您保存 50000 个字符,它将占用 50000 个字符的内存空间。请参考这个mysql链接