MySQL 中数据类型的动态大小

问题描述 投票:0回答:2

我想在MySQL表的一列中保存一个字符串。有时它是 2 个字符,有时甚至更大。 50000 个字符。使用 varchar(50000) 是个好主意吗?如果我只在列中保存 2 个字符,它会使用全部 4998 个字节还是仅使用 2 个字节?

mysql types varchar
2个回答
17
投票

数据类型存储要求中所述:

字符串类型的存储要求

在下表中,

M
表示声明的列长度(以字符为单位)(对于非二进制字符串类型)和字节(对于二进制字符串类型)。
L
表示给定字符串值的实际长度(以字节为单位)。

如果列值需要 0 – 255 字节,则
数据类型 需要存储
CHAR(M)
M
×
w
字节,0 <=
M
<= 255, where
w
是字符集中的字符
BINARY(M)
M
字节,0 <=
M
<= 255
VARCHAR(M)
VARBINARY(M)
L
+ 1 个字节;如果值可能需要超过 255 个字节,则
L
+ 2 个字节
TINYBLOB
TINYTEXT
L
+ 1 个字节,其中
L
< 28
BLOB
TEXT
L
+ 2 个字节,其中
L
< 216
MEDIUMBLOB
MEDIUMTEXT
L
+ 3 个字节,其中
L
< 224
LONGBLOB
LONGTEXT
L
+ 4 个字节,其中
L
< 232
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
(或
utf8mb4
)Unicode 字符集时,您必须记住,并非所有字符都使用相同的字节数,每个字符最多可能需要三(四)个字节。有关不同类别
utf8
utf8mb4
字符使用的存储的详细信息,请参阅第 10.1.10 节“Unicode 支持”

VARCHAR
VARBINARY
以及
BLOB
TEXT
类型是可变长度类型。对于每个因素,存储要求取决于以下因素:

  • 列值的实际长度

  • 列的最大可能长度

  • 列使用的字符集,因为有些字符集包含多字节字符

例如,

VARCHAR(255)
列可以容纳最大长度为255个字符的字符串。假设列使用
latin1
字符集(每个字符一个字节),那么实际需要的存储就是字符串的长度(
L
),加上一个字节来记录字符串的长度。对于字符串
'abcd'
L
为4,存储要求为5个字节。如果同一列声明为使用
ucs2
双字节字符集,则存储要求为 10 个字节:
'abcd'
的长度为 8 个字节,并且该列需要两个字节来存储长度,因为最大长度更大大于 255(最多 510 字节)。

因此,回答你的问题:

如果我只在列中保存 2 个字符,它会使用全部 4998 个字节还是仅使用 2 个字节?

存储 2 个字符字符串的

VARCHAR(50000)
列需要
L
+2 个字节,其中
L
是在列字符中编码该 2 个字符字符串所需的字节数设置:它肯定不会使用“所有4998字节”。


5
投票

MySQL 中有这种 varchar 数据类型,用于动态内存分配数据,即可变长度。因此,如果您保存 2 个字符,它将仅占用 2 个字符的内存空间,如果您保存 50000 个字符,它将占用 50000 个字符的内存空间。请参考这个mysql链接

© www.soinside.com 2019 - 2024. All rights reserved.