MySQL中数据类型的动态大小

时间:2013-11-24 11:34:54

标签: mysql types varchar

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

2 个答案:

答案 0 :(得分:10)

正如Data Type Storage Requirements所述:

  

字符串类型的存储要求

     

在下表中, M 表示非二进制字符串类型的字符长度和二进制字符串类型的字节。 L 表示给定字符串值的实际字节长度。

╔═════════════════════════════╦═════════════════════════════════════════════════╗
║          Data TypeStorage 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, TINYTEXTL + 1 bytes, where L < 28                         ║
╠═════════════════════════════╬═════════════════════════════════════════════════╣
║ BLOB, TEXTL + 2 bytes, where L < 216                        ║
╠═════════════════════════════╬═════════════════════════════════════════════════╣
║ MEDIUMBLOB, MEDIUMTEXTL + 3 bytes, where L < 224                        ║
╠═════════════════════════════╬═════════════════════════════════════════════════╣
║ LONGBLOB, LONGTEXTL + 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 字节来存储值加上三个字节来存储值的长度。

     

要计算用于存储特定CHARVARCHARTEXT列值的字节数,您必须考虑用于该列的字符集以及是否value包含多字节字符。特别是,在使用utf8(或utf8mb4)Unicode字符集时,必须记住并非所有字符都使用相同的字节数,并且每个字符最多可能需要三(4)个字节。有关用于不同类别utf8utf8mb4个字符的存储空间细分,请参阅Section 10.1.10, “Unicode Support”

     

VARCHARVARBINARY以及BLOBTEXT类型是可变长度类型。对于每种产品,存储要求取决于以下因素:

     
      
  • 列值的实际长度

  •   
  • 列的最大可能长度

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

  •   
     

例如,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