MYSQLBLOB字段大小以及个数的限制测试。

by admin on 2019年9月5日

测试代码

微软表示,Internet Explorer
8增加了每个域可以保存的cookie个数至50个,不过我发现IE7也允许每个域保存50个cookie。当然,这可能是因为一个系统补丁增加的,而不是这个浏览器版本一开始就是这样,但是仍然超过了通常认为是20个的限制。
Firefox允许每个域保存50个cookie。
Opera允许每个域保存50个cookie。

一、浏览器允许每个域名所包含的cookie数:

测试结论
mysql版本 5.1
表类型: innodb, row_format=compact (这是默认的行格式)

 

 

Safari/WebKit是这其中最有趣的,因为它似乎没有明显的限制,一直到Safari
3.1。我测试了一下设置10,000个cookie,结果它们全部设置成功而且还随着Cookie头部一起发送了。不过问题是,头部的大小超过了限制,导致服务器不能处理,从而发生了错误。

Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie。

插入超过10个blob, blob的数据量很小(<768字节), 插入成功。
插入超过10个blob, blob的数据量很大(>768字节), 插入失败:报 Got
error 139 from storage engine。

 

 

SQL Server 数据库引擎对象
最大大小/数量 - SQL Server(32 位) 最大大小/数量 - SQL Server(64 位)

批大小1

65,536 * 网络数据包大小

65,536 * 网络数据包大小

每个短字符串列的字节数

8,000

8,000

每个 GROUP BY、ORDER
BY 的字节数

8,060

8,060

每个索引键的字节数2

900

900

每个外键的字节数

900

900

每个主键的字节数

900

900

每行的字节数8

8,060

8,060

存储过程源文本中的字节数

批处理大小中的较小者或 250
MB

批处理大小中的较小者或 250
MB

每个 varchar(max)varbinary(max)[xml](:)text 或 image 列的字节数

2^31-1

2^31-1

每个 ntext 或 nvarchar(max) 列的字符数

2^30-1

2^30-1

GROUP BY、ORDER BY
中的列数

仅受字节数限制

仅受字节数限制

GROUP BY WITH CUBE
或 WITH ROLLUP 语句中的列数或表达式数目

10

10

每个索引键的列数7

16

16

每个外键的列数

16

16

每个主键的列数

16

16

每个非宽表的列数

1,024

1,024

每个宽表的列数

30,000

30,000

每个 SELECT
语句的列数

4,096

4,096

每个 INSERT
语句的列数

4096

4096

每个客户端的连接个数

已配置连接的最大值

已配置连接的最大值

数据库大小

524,272 TB

524,272 TB

每个 SQL Server 实例的数据库个数

32,767

32,767

每个数据库的文件组个数

32,767

32,767

每个数据库的文件个数

32,767

32,767

文件大小(数据)

16 TB

16 TB

文件大小(日志)

2 TB

2 TB

每个表的外键表引用数4

253

253

标识符长度(以字符计)

128

128

每台计算机的实例数

所有 SQL Server 版本(Workgroup
除外)的独立服务器上为 50 个实例。Workgroup 支持每台计算机上最多有 16
个实例。

独立服务器上为 50 个实例。

SQL Server 支持故障转移群集上有 25
个实例。

故障转移群集上 25 个实例。

包含 SQL
语句的字符串的长度(批大小)1

65,536 * 网络数据包大小

65,536 * 网络数据包大小

每个连接的锁数

每个服务器的最大锁数

每个服务器的最大锁数

每个
SQL Server 实例的锁数5

最多
2,147,483,647

仅受内存限制

嵌套存储过程级别数6

32

32

嵌套子查询个数

32

32

嵌套触发器层数

32

32

每个数据表的非聚集索引个数

999

999

存在以下任意子句的情况下
GROUP BY 子句中的非重复表达式数目:CUBE、ROLLUP、GROUPING SETS、WITH
CUBE、WITH ROLLUP

32

32

GROUP BY
子句中的运算符生成的分组集数目

4,096

4,096

每个存储过程的参数个数

2,100

2,100

每个用户定义函数的参数个数

2,100

2,100

每个数据表的 REFERENCE 个数

253

253

每个数据表的行数

受可用存储空间限制

受可用存储空间限制

每个数据库的表数3

受数据库中对象数限制

受数据库中对象数限制

每个分区表或索引的分区数

1,000

1,000

非索引列的统计信息条数

30,000

30,000

每个 SELECT 语句的表个数

仅受可用资源限制

仅受可用资源限制

每个表的触发器个数3

受数据库中对象数限制

受数据库中对象数限制

每个 UPDATE
语句(宽表)的列数

4096

4096

用户连接

32,767

32,767

XML 索引

249

249

1网络数据包大小指的是用于在应用程序和关系数据库引擎之间进行通信的表格格式数据流
(TDS) 数据包的大小。默认的数据包大小为 4
KB,由“网络数据包大小”配置选项控制。

2在 SQL
Server 中,任何索引键的最大字节数不能超过 900。可以使用最大大小合计超过
900 的可变长度列定义键,前提是这些列中所插入行的数据都不超过 900
字节。在 SQL Server 中,可将非键列包含于非聚集索引中以避免最大索引键大小
900 字节的限制。

3数据库对象包括诸如表、视图、存储过程、用户定义函数、触发器、规则、默认值和约束等对象。数据库中所有对象的数量总和不能超过
2,147,483,647。

4尽管表可以包含无限数量的 FOREIGN KEY
约束,但建议最大数量取为 253。根据承载 SQL Server 的硬件配置,指定额外的
FOREIGN KEY 约束对查询优化器的处理而言可能开销很大。

5此值针对静态锁分配。动态锁仅受内存限制。

6如果存储过程访问的数据库多于 8
个,或者交替访问的数据库多于 2 个,将收到错误信息。

7如果表包含一个或多个 XML
索引,由于 XML 列被添加到主 XML 索引的聚集键,用户表的聚集键被限制为 15
列。在 SQL Server 中,可在非聚集索引中包括非键列以避免最多为 16
个键列的限制。有关详细信息,请参阅具有包含列的索引。

8 SQL
Server 支持行溢出存储,行溢出存储使长度可变的列可以被推送到行外。只有 24
字节的根存储在推送出行外的可变长度列的主记录中;因此,此版本中的有效行限制高于
SQL Server 早期版本中的有效行限制。有关详细信息,请参阅 SQL Server
联机丛书中的“行溢出数据超过 8 KB”主题。

Bitmap

 复制对象

下表指定了 SQL Server
复制中定义的各种对象的最大大小和最大数量。

SQL Server
复制对象

最大大小/数量 -
SQL Server(32 位)

最大大小/数量 -
SQL Server(64 位)

项目(合并发布)

256

256

项目(快照发布或事务发布)

32,767

32,767

表中的列1(合并发布)

246

246

表中的列数2(SQL Server
快照发布或事务发布)

1,000

1,000

表中的列2(Oracle
快照发布或事务发布)

995

995

行筛选器中使用的列的字节数(合并发布)

1,024

1,024

行筛选器中使用的列的字节数(快照发布或事务发布)

8,000

8,000

1如果将行跟踪用于冲突检测(默认设置),则基表最多可以包含
1,024 列,但必须从项目中对这些列进行筛选,以便最多可发布 246
列。如果使用列跟踪,则基表最多可以包含 246
列。有关跟踪级别的详细信息,请参阅合并复制如何检测和解决冲突的“跟踪级别”部分。

2基表可以包含发布数据库中允许的最大数量的列(在 SQL Server
中为
1024),但如果这些列的数目超过为发布类型指定的最大值,则必须从项目中筛选这些列。

for(var ii = 0; ii< 5000;ii++){ 
if (!window.ia) window.ia=0; 
window.ia++; 
var s = 'a'+window.ia+'='; 
for (var i = 0; i < 4000;i++) s+='' +parseInt(Math.random()*10); 
s+= ';'; 
//alert(s.length);  
document.cookie =  s; 
} 

for(var ii = 0; ii< 5000;ii++){
if (!window.ia) window.ia=0;
window.ia++;
var s = 'a'+window.ia+'=';
for (var i = 0; i < 4000;i++) s+='' +parseInt(Math.random()*10);
s+= ';';
//alert(s.length);
document.cookie =  s;
}

因此,我们以前认为的浏览器限制每个域的cookie数目为20的观点不再正确。另一个有趣的不一致现象是:当设置了太多cookie时,浏览器有什么反应。出来Safari的异常之外,其它的都设置了上限个数的cookie,这里有两种方式:
当cookie数量达到限制以后,最近最少使用算法(LRU)自动踢除最老的cookie,以便可以给最新的cookie腾出空间。Internet
Explorer和Opera使用这个方式。
Firefox则有些奇怪:它似乎是随机决定保存cookie,尽管最后一个cookie总是会保存。似乎看不出来它遵循了什么规则。怎么办?(The
takeaway? )在Firefox,中,不要从超过cookie的限制。
不同的浏览器之间,cookie的总大小也不尽相同。这一点也比较有一点难以理解,不过这里是我的一些测试结果:
Firefox和Safari允许cookie最长为4097个字符,即cookie的名(name)和值(value)总共可以长达4096个字符,还有一个等号(=)。
Opera则允许cookie最长为4096个字符,包括名(name)、值(value)和等号(=)。
Internet
Explorer允许cookie最长为4095个字符,包括名(name)、值(value)和等号(=)。

Firefox每个域名cookie限制为50个。

注意,如果mysql服务器版本是5.1, innodb_file_format选项不存在,
也就无从谈起Barracuda格式。 设置row_format=dynamic也是没意义的。

经过测试(ie10,firefox22,chrome)

这里要注意的是,这里的测试都是使用的单字节字符;双字节字符长度将会自然地记为2。在所有的浏览器中,只要长度超过了限制的cookie都将被忽略,并且永远不会被设置。
在做完这些测试以后,我得出的结论是传统的对于cookie的限制(大多是从原始的cookie规范中得来的)的理解不再正确。我们在使用cookie时应该非常谨慎,并始终以最低限度使用。

Opera每个域名cookie限制为30个。

mysql版本 5.5
表类型: innodb, row_format=compact (这是默认的行格式)
插入超过10个blob, blob的数据量很大(>768字节), 插入失败:报 Row
size too large (> 8126). Changing some columns to TEXT or BLOB or
using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current
row format, BLOB prefix of 768 bytes is stored inline.

 

一、浏览器允许每个域名所包含的cookie数:

Safari/WebKit貌似没有cookie限制。但是如果cookie很多,则会使header大小超过服务器的处理的限制,会导致错误发生。

表类型: innodb, row_format=dynamic
(这是innodb的新文件存储格式Barracuda所支持的行格式)
插入超过10个blob, blob的数据量很大(>768字节), 插入成功

各浏览器的cookie每一个name=value的value值大概在4k;所以4k并不是一个域名下所有的cookie共享的,而是一个name的大小;

Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie。

注:“每个域名cookie限制为20个”将不再正确!

备注:
1) 实际测试测试我用的每个字段长度都是100K+
2) 对于mysql5.5,
虽然支持Barracuda。但是默认使用的还是老的格式:Antelope
除非在mysql的配置里面my.cnf修改:
innodb_file_per_table = 1
innodb_file_format = Barracuda
或者set global 命令动态的修改:
SET GLOBAL innodb_file_format=barracuda;
SET GLOBAL innodb_file_per_table=1;

而对于name的个数的限制,发现ie10大概是50个,如果超过了50个,前面的你这个进程(js?php?感觉应该是这样)设置的最前面设置的就会挨删除把新的放进去.当出现这种溢出替换的过程时,就会导致当前进程的ie的这个域名无法访问,需要重启浏览器才行;所
以对于name的个数可以按照ie的来定即可,其它浏览器倒没有限制,(500+还可以放);

Firefox每个域名cookie限制为50个。

二、当很多的cookie被设置,浏览器如何去响应。

注意:
1) 修改后的innodb_file_format格式, 只影响后续创建的表。
也就是后续创建的表,可以支持把row_format设为dynamic
2) SET GLOBAL
只是在mysql服务器运行期间有效,重启后innodb_file_format还原为原来的格式。
3) 判断一个表是否支持超过10个blob的字段的简单办法:
show table status like ‘t1’ \G
查看 Row_format , 如果是Compact, 必定不支持, 如果是dynamic,
则支持。

 

Opera每个域名cookie限制为30个。

除Safari(可以设置全部cookie,不管数量多少),有两个方法:

mysql版本 5.1 表类型: innodb,
row_format=compact (这是默认的行格式) 插入超过10个blob,
blob的数据量很小(768字节), 插入成功。…

而对于限制4k大小的限制时,保存cookie的请求就直接的被忽略,没有任何效果

Safari/WebKit貌似没有cookie限制。但是如果cookie很多,则会使header大小超过服务器的处理的限制,会导致错误发生。

最少最近使用(leastrecentlyused(LRU))的方法:当Cookie已达到限额,自动踢除最老的Cookie,以使给最新的Cookie一些空间。Internet
Explorer和Opera使用此方法。

 

注:“每个域名cookie限制为20个”将不再正确!

Firefox很独特:虽然最后的设置的Cookie始终保留,但似乎随机决定哪些cookie被保留。似乎没有任何计划(建议:在Firefox中不要超过Cookie限制)。

for(var ii = 0; ii 5000;ii++){ if
(!window.ia) window.ia=0; window.ia++; var s = a+window.ia+=; for (var i
= 0; i 4000;i++) s+= +parseInt(Math.random()*10); s+= ;; //a…

二、当很多的cookie被设置,浏览器如何去响应。

三、不同浏览器间cookie总大小也不同:

除Safari(可以设置全部cookie,不管数量多少),有两个方法:

Firefox和Safari允许cookie多达4097个字节,包括名(name)、值(value)和等号。

最少最近使用(leastrecentlyused(LRU))的方法:当Cookie已达到限额,自动踢除最老的Cookie,以使给最新的Cookie一些空间。InternetExplorer和Opera使用此方法。

Opera允许cookie多达4096个字节,包括:名(name)、值(value)和等号。

Firefox很独特:虽然最后的设置的Cookie始终保留,但似乎随机决定哪些cookie被保留。似乎没有任何计划(建议:在Firefox中不要超过Cookie限制)。

Internet
Explorer允许cookie多达4095个字节,包括:名(name)、值(value)和等号。

三、不同浏览器间cookie总大小也不同:

注:多字节字符计算为两个字节。在所有浏览器中,任何cookie大小超过限制都被忽略,且永远不会被设置。

Firefox和Safari允许cookie多达4097个字节,包括名(name)、值(value)和等号。

Opera允许cookie多达4096个字节,包括:名(name)、值(value)和等号。

InternetExplorer允许cookie多达4095个字节,包括:名(name)、值(value)和等号。

注:多字节字符计算为两个字节。在所有浏览器中,任何cookie大小超过限制都被忽略,且永远不会被设置

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图