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


当前回答

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

其他回答

在流行的网页浏览器中,最低公分母最大URL长度:2083 (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字节,在所有列之间共享)和所使用的字符集。

所以… < MySQL 5.0.3使用TEXT 或 >= MySQL 5.0.3使用VARCHAR(2083)

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

这实际上取决于您的用例(见下文),但存储为TEXT会有性能问题,而且对于大多数情况来说,巨大的VARCHAR听起来有点过头了。

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

Twitter方法:为了获得非常好的用户体验,为过长的URL提供一个自动URL缩短器,并将链接的“显示版本”存储为URL片段,在末尾使用省略号。(例如:http://stackoverflow.com/q/219569/1235702将显示为stackoverflow.com/q/21956…并将链接到一个缩短的URL http://ex.ampl/e1234)

注意事项

Obviously, the Twitter approach is nicer, but for my app's needs, recommending a URL shortener was sufficient. URL shorteners have their drawbacks, such as security concerns. In my case, it's not a huge risk because the URL's are not public and not heavily used; however, this obviously won't work for everyone. safe.mn appears to block a lot of spam and phishing URL's, but I would still recommend caution. Be sure to note that you shouldn't force your users to use a URL shortener. For most cases (at least for my app's needs), 500 characters is overly sufficient for what most users will be using it for. Only use/recommend a URL shortener for overly-long links.

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

您需要根据URL使用的频率以及是否需要解除长度的限制,在TEXT列或VARCHAR列之间进行选择。

使用VARCHAR maxlength >= 2083,如micahwittman建议,如果:

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

在以下情况下使用TEXT:

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