URL的最佳数据库字段类型

Jes*_*ugh 332 mysql sql database

我需要在MySQL表中存储一个url.定义一个包含未确定长度的URL的字段的最佳做法是什么?

mic*_*man 310

  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)

  • 这个答案有点误导.请注意,"最低公分母"在这里毫无意义,您希望使用浏览器或服务器将接受的*最高*数字(这是不一致且可能会更改).正如您的链接所说:"*...... HTTP协议的规范没有指定任何最大长度...*",所以不要打扰`VARCHAR(2083)`,只需使用`TEXT`. (73认同)
  • 很好的答案,但我会限制长度.根据项目,您可能希望限制接受的URL.谁使用网址超过200? (13认同)
  • 例如,也来自您的链接:"*在65,536个字符之后,位置栏不再显示Windows Firefox 1.5.x中的URL.但是,更长的URL将起作用.我在100,000个字符后停止测试.*" (4认同)
  • 他们最好提出一个"理解"uri结构的uri数据类型,以便有效地完成索引和搜索,就像oracle一样......等等,mysql现在是oracle的...... http://download.oracle. COM /文档/ CD/B10464_05/web.904/b12099/adx06uri.htm (2认同)

Dan*_*wak 32

VARCHAR(512)(或类似的)应该足够了.但是,由于您实际上并不知道相关网址的最大长度,我可能会直接指向TEXT.这样做的危险当然是效率的降低,因为CLOBs比简单的字符串数据类型慢得多VARCHAR.


Bob*_*bst 16

varchar(max) 对于SQLServer2005

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

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

  • 在MySQL中,除非是表中唯一的列,否则很可能无法获得大的varchar. (4认同)
  • 在您的代码片段中,`max` 是一个神奇的 ANSI SQL 说明符,可以根据需要增加 VARCHAR 的大小,还是只是为了示例而只是一个元变量? (2认同)

mrg*_*ves 9

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

使用VARCHAR,maxlength> = 2,083,micahwittman建议的那样:

  1. 您将在每个查询中使用大量URL(与TEXT列不同,VARCHAR与行内联存储)
  2. 您非常确定URL永远不会超过65,535字节的行限制.

使用TEXT如果:

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


小智 9

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

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
Run Code Online (Sandbox Code Playgroud)

  • UTF-8是否只使用更多空间? (5认同)

car*_*son 5

大多数浏览器允许您在 URL 中放入大量数据,因此很多事情最终会创建非常大的 URL,因此如果您谈论的内容超出 URL 的域部分,则需要使用 TEXT 列,因为VARCHAR/CHAR 是有限的


Cul*_*enJ 5

这实际上取决于您的用例(请参阅下文),但是存储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缩短器。

  • 如果要提供内置的URL缩短器,是否还需要将全长URL存储在某个数据库中才能正常工作?:-) (8认同)
  • 当然; 但我怀疑大多数人会编写自己的缩短器。自从写这篇文章以来,我了解到有很多 URL 缩短 API(这里列出了 71 个:http://www.programmableweb.com/news/71-url-shortener-apis-bit.ly-google-url -shortener-and-tiny-url-open/2012/10/31),因此您甚至无需编写自己的程序就可以自动化该过程。当然,这仍然取决于用户的知识和同意。 (2认同)
  • 我不确定 2014 年 safe.mn 是什么,但这个答案不再相关,因为该网站已经离线并失去了域名。 (2认同)

Alt*_*ter 5

以下是 AWS 提供的一些 SQL 数据类型。 在此输入图像描述