URL的最佳数据库字段类型


352

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


1
它取决于您的需求,索引,统一性?
Thomas Decaux

2
我在这里期待一个相当简单的答案,但是对于涵盖我未曾考虑过的项目的答案感到非常惊讶。我已经添加到我的教育帐户中的非常有趣的阅读。
HPWD

1
只需选择TEXT类型,然后跳过下面的所有这些答案即可。最后,这就是大多数人的建议。:)当然,如果您需要索引或唯一性,请使用VARCHAR,因为TEXT它不那么容易被索引。
Aleksandar

Answers:


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

  2. 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字节,在所有列之间共享)和所使用的字符集。

  3. 所以...
    <MySQL 5.0.3使用TEXT

    > = MySQL 5.0.3使用VARCHAR(2083)


14
好的答案,但我个人会限制长度。根据项目,您可能希望限制可接受的URL。谁使用的URL长度超过200?
约翰

2
他们最好提供一个uri数据类型,以“理解” uri的结构,以便高效地完成索引和搜索,就像oracle一样...等等,mysql现在是oracle的... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
redben

80
这个答案有点误导。请注意,此处的“最低公分母”是没有意义的,您要使用浏览器或服务器可接受的最高数字(此数字不一致,并且可能会发生变化)。就像您的链接说的那样:“ ... HTTP协议的规范未指定任何最大长度... ”,因此不必理会VARCHAR(2083),只需使用即可TEXT
韦斯利·默奇

4
例如,同样来自您的链接:“ 在65,536个字符之后,位置栏不再在Windows Firefox 1.5.x中显示URL。但是,更长的URL可以使用。我在100,000个字符后停止了测试。
Wesley Murch

1
boutell.com资源掉线了。这是在一本O'Reilly扫描的书中对它的引用:books.google.ca/…–
micahwittman,

33

VARCHAR(512)(或类似)应该足够。但是,由于您实际上并不知道所讨论的URL的最大长度,因此我可能直接转到TEXT。这样做的危险当然是效率的损失,因为CLOBs比简单的字符串数据类型(如)要慢得多VARCHAR


排序规则如何?
kommradHomer

16

varchar(max) 对于SQLServer2005

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

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


1
在您的代码段中,是max一个神奇的ANSI SQL说明符,可以根据需要增加VARCHAR的大小,还是出于示例目的,它仅仅是一个元变量?
Daniel Spiewak

4
在MySQL中,除非它是表中的唯一列,否则您很可能无法拥有那么大的varchar。
卡森,

1
@Daniel Spiewak:“ TEXT和VARCHAR(MAX)之间的基本区别是TEXT类型将始终将数据存储在blob中,而VARCHAR(MAX)类型将尝试将数据直接存储在行中,除非它超过8k限制,然后将其存储在blob中。” stackoverflow.com/questions/834788/… 但是问题是关于MySQL的,因此在这里并没有真正的意义。
Stijn Bollen 2014年

9

您将根据使用URL的频率以及是否实际需要绑定长度来在TEXT或VARCHAR列之间进行选择。

如果满足以下条件,则按照micahwittman的建议使用maxlength> = 2,083的VARCHAR

  1. 每个查询将使用很多URL(与TEXT列不同,VARCHAR与行内存储)
  2. 您非常确定URL不会超过65,535字节的行数限制。

如果满足以下条件,则使用TEXT

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

9

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

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

5
UTF-8是否仅在需要时才使用更多空间?
kommradHomer

7

这实际上取决于您的用例(请参阅下文),但存储TEXT会带来性能问题,并且VARCHAR在大多数情况下听起来像是过大的杀伤力。

我的方法:使用较大但不合理的VARCHAR长度(例如,VARCHAR(500)大约),并鼓励需要较大URL的用户使用URL缩短器(例如)safe.mn

Twitter的方法:对于非常好的UX,请为长度过长的URL提供一个自动URL缩短器,并将链接的“显示版本”存储为URL的片段,并在其末尾带有省略号。(示例:http://stackoverflow.com/q/219569/1235702将显示为stackoverflow.com/q/21956...,并将链接到缩短的URL http://ex.ampl/e1234

注意事项和警告

  • 显然,Twitter方法更好,但是对于我的应用程序的需求,推荐一个URL缩短即可。
  • URL缩短器有其缺点,例如安全性问题。就我而言,这不是很大的风险,因为该URL不是公开的也不被大量使用。但是,这显然不适用于所有人。safe.mn似乎阻止了很多垃圾邮件和网络钓鱼URL,但我仍然建议您谨慎使用。
  • 请务必注意,您不应强迫用户使用URL缩短器。在大多数情况下(至少满足我的应用程序的需要),对于大多数用户将要使用的字符来说,500个字符已经足够了。仅对超长链接使用/推荐URL缩短器。

10
如果要提供内置的URL缩短器,是否还需要将全长URL存储在某个数据库中才能正常工作?:-)
Neil Neyman 2014年

2
当然; 但我怀疑大多数人会写自己的起酥油。因为写这个,我了解到,有很多URL缩短API的在那里(71这里列出:programmableweb.com/news/...),所以你可能甚至没有写自己的过程自动化。当然,它仍然取决于用户的知识和同意。
再次



1

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


1

您最好使用varchar(max),它(就大小而言)表示varchar (65535)。这甚至可以存储您更大的网址,也可以节省空间。

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

请参见本文 TechNet上的有关使用使用大值数据类型


varchar (max)是SQLServer语法,不适用于MySQL(与原始问题一样)。此外,这并不意味着,varchar (65535)因为65535是mysql中一行中最大ASCII字符数,因此它还取决于其他字段和字符集。
弗林斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.