最佳数据库字段types的URL

我需要在MySQL表中存储一个URL。 定义一个字段的最佳做法是什么?

  1. stream行的Web浏览器中最小公分母最大URL长度: 2,083 (Internet Explorer)

  2. http://dev.mysql.com/doc/refman/5.0/en/char.html
    VARCHAR列中的值是可变长度的string。 在MySQL 5.0.3之前,长度可以指定为0到255之间的值,5.0.3和更高版本中的长度可以是0到65,535。 在MySQL 5.0.3及更高版本中,VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列之间共享)和使用的字符集。

  3. 所以…
    <MySQL 5.0.3使用TEXT
    要么
    > = MySQL 5.0.3使用VARCHAR(2083)

VARCHAR(512) (或类似)应该足够了。 但是,由于您并不真正了解相关url的最大长度,因此我可能会直接转到TEXT 。 由于CLOB远低于VARCHAR这样的简单string数据types,所以这样做的危险当然会降低效率。

SQLServer2005的varchar(max)

varchar(65535)适用于MySQL 5.0.3及更高版本

这将根据需要分配存储空间,不应影响性能。

您应该使用带有ASCII字符编码的VARCHAR。 URL是百分比编码,国际域名使用punycode,所以ASCII码足以存储它们。 这将比UTF8使用更less的空间。

 VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL 

大多数浏览器会让你把大量的数据放在一个URL中 ,因此很多事情最终都会创build非常大的URL,所以如果你所谈论的不仅仅是一个URL的域部分,你将需要使用一个TEXT列, VARCHAR / CHAR是有限的 。

您将要根据URL的使用频率以及是否实际需要解除绑定长度来selectTEXT列还是VARCHAR列。

如果micahwittmanbuild议使用maxlength> = 2,083的 VARCHAR ,如果:

  1. 每个查询都会使用很多URL(与TEXT列不同,VARCHAR与行内联存储)
  2. 你很确定一个URL永远不会超过65,535字节的行限制。

使用TEXT如果:

  1. 该URL确实可能会破坏65,535字节的行限制
  2. 您的查询不会一次(或经常)select或更新一堆url。 这是因为TEXT列只是内联一个指针,并且涉及到检索引用数据的随机访问可能是痛苦的。

这真的取决于你的用例(见下面),但是作为TEXT存储性能问题,大多数情况下一个巨大的VARCHAR听起来像是过度杀毒。

我的做法是:使用慷慨的,但不是不合理的大VARCHAR长度,如VARCHAR(500)左右,并鼓励需要更大URL的用户使用URL safe.mn ,如safe.mn

Twitter的方法:对于一个非常好的用户体验,提供一个自动URL缩短过长的URL,并将链接的“显示版本”存储为最后带有省略号的URL的片段。 (例如: http://ex.ampl/e1234将显示为stackoverflow.com/q/21956...并链接到一个缩短的URL http://ex.ampl/e1234

笔记和警告

  • 显然,Twitter的方法是更好的,但为了我的应用程序的需要,推荐一个URL缩写就足够了。
  • url缩写有其缺陷,如安全问题。 就我而言,这不是一个巨大的风险,因为这个URL不是公开的,也没有被大量使用。 但是,这显然不适合每个人。 safe.mn似乎阻止了大量的垃圾邮件和钓鱼url,但我仍然build议小心。
  • 请务必注意,您不应该强制您的用户使用URL缩短器。 对于大多数情况下(至less对于我的应用程序的需要),500个字符对于大多数用户将使用它的情况已经足够了。 只能使用/推荐URL超短链接。

我不知道其他浏览器,但是IE7对HTTP GET操作有2083个字符的限制 。 除非其他浏览器有更低的限制,否则我不明白为什么你需要比2083更多的字符。

你最好使用varchar(max) which(就大小而言)是指varchar (65535) 。 这将甚至存储您的更大的url,并将节省您的空间。

最大说明符扩展了varchar,nvarchar和varbinary数据types的存储function。 varchar(max),nvarchar(max)和varbinary(max)统称为大值数据types。 您可以使用大值数据types来存储最多2 ^ 31-1个字节的数据。

请参阅TechNet上有关使用“使用大数值数据types”的文章

大多数Web服务器有一个URL长度限制(这就是为什么“URI太长”的错误代码),这意味着有一个实际的大小。 find最stream行的Web服务器的默认长度限制,并使用其中最大的作为该字段的最大大小; 它应该是绰绰有余。