MySQL中数据类型的动态大小

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,VARCHARTEXT列的值时,必须考虑到用于该列是否值包含多字节字符的字符集.特别是,在使用utf8(或utf8mb4)Unicode字符集时,必须记住,并非所有字符都使用相同的字节数,并且每个字符最多可能需要三(4)个字节.有关用于不同类别utf8utf8mb4字符的存储的细分,请参见第10.1.10节"Unicode支持".

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

  • 列值的实际长度

  • 列的最大可能长度

  • 用于该列的字符集,因为某些字符集包含多字节字符

例如,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个字节".


Aje*_*esh 5

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