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

标签 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 将实际数据的大小与该数据一起存储。为了存储该大小,它需要:

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

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

问题

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

最佳答案

这是答案1。

从您链接到的文档:

These correspond to the four BLOB types and have the same maximum lengths and storage requirements. See Section 11.6, “Data Type Storage Requirements”.

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

L + 4 bytes, where L < 232

L represents the actual length in bytes of a given string value.

至于声明的最大列长度,你自己试试吧:

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 类型的大小。)

关于mysql - MySql TEXT/BLOB 类型的最大声明列长度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13379333/

相关文章:

node.js - 如何在 node.js 上将 blob 保存为 webm

oracle - 从oracle中的clob中提取一个子串

mysql - 糟糕的 MySQL 数据库设计?

mysql - Google Cloud SQL - 插入性能慢

Azure 存储 Blob 类型(CloudBlobContainer、CloudBlobClient 等)和线程安全

java - Hibernate 4.x - 将 Clob 作为字符串插入数据库(Oracle - MySql)

c++ - 在 Oracle OCCI/OCI 中,读取 LOB 的缓冲区是否应该大于实际数据?获取 ORA-32116

java - 当数据库中没有记录时,结果集抛出语法错误

mysql - 使用某些条件过滤时 SQL 给出错误结果

sql - 如何在 Oracle SQL Developer 中查看 blob 数据