如果您要在数据库中存储一个用户代理,您将容纳多大的用户代理?
我发现这篇technet文章建议将UA保持在200以下。它看起来不像HTTP规范中定义的,至少我没有发现。我的UA已经有149个字符了,而且似乎每一个版本的。net都会增加它。
我知道我可以解析出字符串并分解它,但我宁愿不这样做。
编辑 基于此博客,IE9将更改为发送短UA字符串。这是一个很好的改变。
如果您要在数据库中存储一个用户代理,您将容纳多大的用户代理?
我发现这篇technet文章建议将UA保持在200以下。它看起来不像HTTP规范中定义的,至少我没有发现。我的UA已经有149个字符了,而且似乎每一个版本的。net都会增加它。
我知道我可以解析出字符串并分解它,但我宁愿不这样做。
编辑 基于此博客,IE9将更改为发送短UA字符串。这是一个很好的改变。
当前回答
我的看法是:
使用专用的表只存储UserAgents(规范化) 在相关表中,存储一个外键值,以指向UserAgent自动递增主键字段 将实际的UserAgent字符串存储在TEXT字段中,而不关心长度 有另一个唯一的二进制(32)(或64,或128取决于你的哈希长度)和哈希UserAgent
一些UA字符串可能会非常长。这样你就不用担心了。同时在INSERTer中强制最大长度以保持UA字符串在4KB以下。除非有人在用户代理中给你发邮件,否则它不应该超过这个长度。
其他回答
我今天得到了这个用户代理,溢出了我们供应商的存储域:
Mozilla / 4.0 (compatible;MSIE 8.0;Windows NT 5.1;三叉戟/ 4.0;GTB6; .net CLR 1.1.4322;.net CLR 2.0.50727;.net CLR 3.0.04506.30;MDDR; OfficeLiveConnector.1.3;OfficeLivePatch.0.0;.net CLR 3.0.4506.2152; .net CLR 3.5.30729
荒谬!229字符?
所以,把这个规模翻倍,再翻倍,你就可以等到微软的下一个错误(也许明年的这个时候)了。
要大于1000!
没有指定的限制,只有大多数HTTP服务器的限制。但是,请记住这一点,我将实现一个具有合理固定长度的列(使用谷歌查找已知用户代理的列表,找到最大的并添加50%),并且只裁剪任何太长的用户代理—任何特别长的用户代理即使在裁剪时也可能足够唯一,或者是某种错误或“黑客”尝试的结果。
这个大的怎么样?:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; YPC 3.2.0; SearchSystem6829992239; SearchSystem9616306563; SearchSystem6017393645; SearchSystem5219240075; SearchSystem2768350104; SearchSystem6919669052; SearchSystem1986739074; SearchSystem1555480186; SearchSystem3376893470; SearchSystem9530642569; SearchSystem4877790286; SearchSystem8104932799; SearchSystem2313134663; SearchSystem1545325372; SearchSystem7742471461; SearchSystem9092363703; SearchSystem6992236221; SearchSystem3507700306; SearchSystem1129983453; SearchSystem1077927937; SearchSystem2297142691; SearchSystem7813572891; SearchSystem5668754497; SearchSystem6220295595; SearchSystem4157940963; SearchSystem7656671655; SearchSystem2865656762; SearchSystem6520604676; SearchSystem4960161466; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Hotbar 10.2.232.0; SearchSystem9616306563; SearchSystem6017393645; SearchSystem5219240075; SearchSystem2768350104; SearchSystem6919669052; SearchSystem1986739074; SearchSystem1555480186; SearchSystem3376893470; SearchSystem9530642569; SearchSystem4877790286; SearchSystem8104932799; SearchSystem2313134663; SearchSystem1545325372; SearchSystem7742471461; SearchSystem9092363703; SearchSystem6992236221; SearchSystem3507700306; SearchSystem1129983453; SearchSystem1077927937; SearchSystem2297142691; SearchSystem7813572891; SearchSystem5668754497; SearchSystem6220295595; SearchSystem4157940963; SearchSystem7656671655; SearchSystem2865656762; SearchSystem6520604676; SearchSystem4960161466; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
假设用户代理字符串的长度没有限制,并准备存储这样一个值。正如你所看到的,长度是不可预测的。
在Postgres中,有一种文本类型可以接受无限长度的字符串。使用它。
但最有可能的是,您必须在某个时刻开始截断。在一个相当有用的增量(200,1k, 4k)上称它为好,然后扔掉其余的。
HTTP规范根本不限制头的长度。 然而,web服务器确实限制他们接受的头部大小,如果超过413实体太大抛出。
根据web服务器及其设置,这些限制从4KB到64KB不等(所有头文件的总和)。