Spo*_*Bob 6 mysql varchar types
我想在MySQL的一列表中保存一个字符串.有时它是2个字符,有时甚至更大.50000个字符.用户varchar(50000)是个好主意.如果我只在列中保存2个字符,它是使用所有4998字节还是只使用2个字节?
egg*_*yal 11
字符串类型的存储要求
在下表中,
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列的值时,必须考虑到用于该列是否值包含多字节字符的字符集.特别是,在使用utf8(或utf8mb4)Unicode字符集时,必须记住,并非所有字符都使用相同的字节数,并且每个字符最多可能需要三(4)个字节.有关用于不同类别utf8或utf8mb4字符的存储的细分,请参见第10.1.10节"Unicode支持".
VARCHAR,VARBINARY以及BLOB和TEXT类型是可变长度类型的.对于每个,存储要求取决于以下因素:
列值的实际长度
列的最大可能长度
用于该列的字符集,因为某些字符集包含多字节字符
例如,
VARCHAR(255)列可以包含最大长度为255个字符的字符串.假设列使用latin1字符集(每个字符一个字节),所需的实际存储量是string(L)的长度,加上一个字节来记录字符串的长度.对于字符串'abcd',L为4,存储要求为5个字节.如果声明同一列使用ucs2双字节字符集,则存储要求为10个字节:长度'abcd'为8个字节,并且该列需要两个字节来存储长度,因为最大长度大于255(最多510个)字节).
因此,在回答你的问题时:
如果我只在列中保存2个字符,它是使用所有4998字节还是只使用2个字节?
一个VARCHAR(50000)存储2个字符的字符串列需要L+2个字节,其中L的编码列的字符集2个字符的字符串所需的字节数,它肯定不会用"的所有4998个字节".