URL的最佳数据库字段类型

我需要在MySQL表中存储一个url。定义包含不确定长度的URL的字段的最佳实践是什么?

305161 次浏览

VARCHAR(512)(或类似)应该足够了。然而,因为你不知道问题中的url的最大长度,我可能只是直接去TEXT。这样做的危险当然是效率的损失,因为__abc2比VARCHAR这样的简单字符串数据类型慢得多。

varchar(max)用于SQLServer2005

varchar(65535)用于MySQL 5.0.3及以上版本

这将根据需要分配存储,并且不会影响性能。

大多数浏览器都允许你放置URL中包含大量的数据,因此很多东西最终会创建非常大的URL,所以如果你谈论的是URL的域部分以外的任何内容,你将需要使用一个TEXT列,因为VARCHAR/CHAR是有限的

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

大多数web服务器都有URL长度限制(这就是为什么会有“URI过长”的错误代码),这意味着有一个实际的上限大小。找到最流行的web服务器的默认长度限制,并使用它们中最大的作为字段的最大大小;这应该绰绰有余。

  1. 流行浏览器中最小公分母最大URL长度:2,083 (Internet Explorer)
    <李> http://dev.mysql.com/doc/refman/5.0/en/char.html
    VARCHAR列中的值是可变长度的字符串。长度在MySQL 5.0.3之前可以指定为0到255,在5.0.3及更高版本中可以指定为0到65,535。在MySQL 5.0.3及以后版本中,VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列之间共享)和所使用的字符集
    <李>所以…
    & lt;MySQL 5.0.3使用文本

    MySQL 5.0.3使用VARCHAR (2083)
你最好使用varchar (max),它(在大小方面)意味着varchar (65535)。 这甚至可以存储你更大的网址,也会节省你的空间
max说明符扩展了varchar的存储能力, Nvarchar和varbinary数据类型。Varchar (max), nvarchar(max),和 Varbinary (max)统称为大值数据类型。你可以 使用大值数据类型存储最多2^31-1字节的数据

关于使用大值数据类型,请参阅TechNet上的这篇文章

你需要基于URL将被使用的频率在TEXT列或VARCHAR列之间进行选择,以及你实际上是否需要解绑定长度。

使用VARCHAR with maxlength >= 2083年,如micahwittman所建议的,如果:

  1. 每个查询将使用许多url(与TEXT列不同,varchar与行内联存储)
  2. 您可以非常肯定URL永远不会超过65,535字节的行限制。

在以下情况使用文本:

  1. URL可能真的会打破65,535字节的行限制
  2. 您的查询不会一次(或经常)选择或更新一堆url。这是因为TEXT列只是内联保存一个指针,检索引用数据所涉及的随机访问可能是痛苦的。

这真的取决于你的用例(见下文),但存储为TEXT有性能问题,而且一个巨大的VARCHAR在大多数情况下听起来有点多余。

我的方法:使用一个大方的,但不是不合理的大VARCHAR长度,如VARCHAR(500)左右,并鼓励需要更大URL的用户使用URL缩短器,如safe.mn

推特方法:对于一个真正好的用户体验,为过长的URL提供一个自动URL缩短器,并将链接的“显示版本”存储为URL的一个片段,在结尾使用省号。(例如:http://stackoverflow.com/q/219569/1235702将显示为stackoverflow.com/q/21956...,并将链接到一个缩短的URL http://ex.ampl/e1234)

注意事项

  • 显然,Twitter方法更好,但对于我的应用程序的需求,推荐一个URL缩短器就足够了。
  • URL缩短器也有其缺点,比如安全问题。在我的例子中,这并不是一个巨大的风险,因为URL不是公开的,也没有大量使用;然而,这显然并不适用于所有人。安全的。mn似乎屏蔽了很多垃圾邮件和钓鱼网址,但我仍然建议谨慎。
  • 一定要注意,你不应该强迫你的用户使用URL缩短器。在大多数情况下(至少对于我的应用程序来说),500个字符对于大多数用户来说已经足够了。对于过长的链接,只使用/推荐URL缩短器。

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

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
下面是一些基于AWS的SQL数据类型。 enter image description here < / p >