我想在MySQL的表格列中保存一个字符串。有时它是2个字符,有时甚至更大。 50000个字符。用户varchar(50000)是个好主意。如果我只在列中保存2个字符,它是使用所有4998个字节还是只使用2个字节?
答案 0 :(得分:10)
正如Data Type Storage Requirements所述:
字符串类型的存储要求
在下表中,
M
表示非二进制字符串类型的字符长度和二进制字符串类型的字节。L
表示给定字符串值的实际字节长度。╔═════════════════════════════╦═════════════════════════════════════════════════╗ ║ Data Type ║ Storage Required ║ ╠═════════════════════════════╬═════════════════════════════════════════════════╣ ║ CHAR(M) ║ M × w bytes, 0 <= M <= 255, where w is the ║ ║ ║ number of bytes required for the maximum-length ║ ║ ║ character in the character set ║ ╠═════════════════════════════╬═════════════════════════════════════════════════╣ ║ BINARY(M) ║ M bytes, 0 <= M <= 255 ║ ╠═════════════════════════════╬═════════════════════════════════════════════════╣ ║ VARCHAR(M), VARBINARY(M) ║ L + 1 bytes if column values require 0 – 255 ║ ║ ║ bytes, L + 2 bytes if values may require more ║ ║ ║ than 255 bytes ║ ╠═════════════════════════════╬═════════════════════════════════════════════════╣ ║ TINYBLOB, TINYTEXT ║ L + 1 bytes, where L < 28 ║ ╠═════════════════════════════╬═════════════════════════════════════════════════╣ ║ BLOB, TEXT ║ L + 2 bytes, where L < 216 ║ ╠═════════════════════════════╬═════════════════════════════════════════════════╣ ║ MEDIUMBLOB, MEDIUMTEXT ║ L + 3 bytes, where L < 224 ║ ╠═════════════════════════════╬═════════════════════════════════════════════════╣ ║ LONGBLOB, LONGTEXT ║ L + 4 bytes, where L < 232 ║ ╠═════════════════════════════╬═════════════════════════════════════════════════╣ ║ ENUM('value1','value2',...) ║ 1 or 2 bytes, depending on the number of ║ ║ ║ enumeration values (65,535 values maximum) ║ ╠═════════════════════════════╬═════════════════════════════════════════════════╣ ║ SET('value1','value2',...) ║ 1, 2, 3, 4 or 8 bytes, depending on the number ║ ║ ║ of set members (64 members maximum) ║ ╚═════════════════════════════╩═════════════════════════════════════════════════╝使用长度前缀加数据存储可变长度字符串类型。长度前缀需要1到4个字节,具体取决于数据类型,前缀的值为
L
(字符串的字节长度)。例如,MEDIUMTEXT
值的存储需要L
字节来存储值加上三个字节来存储值的长度。要计算用于存储特定
CHAR
,VARCHAR
或TEXT
列值的字节数,您必须考虑用于该列的字符集以及是否value包含多字节字符。特别是,在使用utf8
(或utf8mb4
)Unicode字符集时,必须记住并非所有字符都使用相同的字节数,并且每个字符最多可能需要三(4)个字节。有关用于不同类别utf8
或utf8mb4
个字符的存储空间细分,请参阅Section 10.1.10, “Unicode Support”。
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个字节,其中 {{ 1}} 是在列的字符集中编码该2字符字符串所需的字节数:它肯定不会使用“所有4998字节”。
答案 1 :(得分:3)
MySQL中有 varchar 数据类型,用于动态内存分配可变长度的数据。因此,如果你保存2个字符,它将只占用2个字符存储空间,如果你节省50000个字符,它将占用50000个字符存储空间。请参阅此mysql link