MySql TEXT / BLOB类型的最大声明列长度是多少?

时间:2012-11-14 13:01:51

标签: mysql blob clob

前奏

  • 我的问题忽略了“客户端和服务器之间实际可以传输的最大值取决于可用内存量和通信缓冲区的大小”。
  • 我也不会在这里考虑Unicode。我知道如果一个字符使用超过1个字节的存储空间,TEXT列的实际最大长度(字符数)将减少。

在这里咨询MySql文档时:http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html,我可以为我的问题得出2个答案......

1)更明显的答案:

TINYBLOB   : 2 ^  8 - 1 = 255
BLOB       : 2 ^ 16 - 1 = 65535
MEDIUMBLOB : 2 ^ 24 - 1 = 16777215
LONGBLOB   : 2 ^ 32 - 1 = 4294967295

2)比较复杂的答案:

TINYBLOB   : 2 ^  8 - 1 = 255
BLOB       : 2 ^ 16 - 2 = 65534
MEDIUMBLOB : 2 ^ 24 - 3 = 16777213
LONGBLOB   : 2 ^ 32 - 4 = 4294967292

MySql存储实际数据的大小以及该数据。并且为了存储该尺寸,它将需要:

  • 数据时的1字节< 256 B
  • 数据时的2个字节< 64 KB
  • 数据时的3个字节< 16 MB
  • 4字节,数据< 4 GB

因此,为了存储数据加上数据的大小,并防止它超过256 / 64K / 16M / 4G字节所需的存储空间,在确定时需要-1 / -2 / -3 / -4因子最大声明列长度(不是-1 / -1 / -1 / -1)。我希望这是有道理的:)

问题

这2个答案中的哪一个是正确的? (假设其中一个是。)

1 个答案:

答案 0 :(得分:2)

这是答案1.

从您链接的文档:

  

这些对应于四种BLOB类型,并且具有相同的最大长度和存储要求。参见11.6节“Data Type Storage Requirements”

其他页面有一个包含这些约束的表。对于LONGBLOB,所需的存储是:

  

L + 4个字节,其中L< 2 32

     

L表示给定字符串值的实际字节长度。

至于声明的最大列长度,请自行尝试:

mysql> create table foo(a blob(4294967295));
Query OK, 0 rows affected (0.08 sec)

mysql> create table bar(a blob(4294967296));
ERROR 1439 (42000): Display width out of range for column 'a' (max = 4294967295)

(您不能为其他三种blob类型声明大小。)