【问题标题】:Best database field type for a URLURL 的最佳数据库字段类型
【发布时间】:2010-09-18 04:30:10
【问题描述】:

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

【问题讨论】:

  • 这取决于你需要什么,索引,唯一性?
  • 只需使用TEXT 类型并跳过阅读下面的所有这些答案。最后,这就是他们中的大多数人的建议。 :) 当然,如果您需要索引或唯一性,请选择VARCHAR,因为TEXT 无法索引that easily

标签: sql mysql database


【解决方案1】:
  1. Lowest common denominator max URL length among popular web browsers: 2,083 (Internet Explorer)
  1. 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 字节,所有列共享)和使用的字符集。
  1. 所以...
    TEXT

    >= MySQL 5.0.3 使用 VARCHAR(2083)

【讨论】:

  • 很好的答案,但我个人会限制长度。根据项目,您可能希望限制接受的 url。谁使用的 url 长度超过 200?
  • 他们最好想出一个 uri 数据类型来“理解” uri 的结构,以便像 oracle 那样高效地完成索引和搜索……等等,mysql 现在是 oracle 的…… download.oracle.com/docs/cd/B10464_05/web.904/b12099/…
  • 这个答案有点误导。请注意,此处的“最小公分母”没有意义,您要使用浏览器或服务器将接受的 最高 数字(不一致且可能会更改)。正如您的链接所说:“...HTTP 协议的规范没有指定任何最大长度...”,所以不要理会VARCHAR(2083),只需使用TEXT
  • 示例,同样来自您的链接:“在 65,536 个字符后,位置栏不再显示 Windows Firefox 1.5.x 中的 URL。但是,更长的 URL 将起作用。我在 100,000 个字符后停止测试字符。"
  • botell.com 资源掉线了。这是一本扫描的 O'Reilly 书中对它的引用:books.google.ca/…
【解决方案2】:

VARCHAR(512)(或类似的)应该足够了。但是,由于您并不真正知道相关 URL 的最大长度,我可能会直接访问 TEXT。这样做的危险当然是效率损失,因为CLOBs 比VARCHAR 等简单的字符串数据类型慢得多。

【讨论】:

  • 排序规则怎么样?
【解决方案3】:

varchar(max) 用于 SQLServer2005

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

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

【讨论】:

  • 在你的 sn-p 中,max 是一个神奇的 ANSI SQL 说明符,可以根据需要增加 VARCHAR 的大小,还是只是一个元变量?
  • 在 MySQL 中,除非它是表中唯一的列,否则您很可能无法拥有那么大的 varchar。
  • @Daniel Spiewak:“TEXT 和 VARCHAR(MAX) 之间的基本区别在于 TEXT 类型将始终将数据存储在 blob 中,而 VARCHAR(MAX) 类型将尝试直接存储数据在行中,除非它超过 8k 限制,然后将其存储在一个 blob 中。” stackoverflow.com/questions/834788/… 但问题是关于 MySQL 的,所以这与这里无关。
【解决方案4】:

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

我的做法: 使用大方但不会过大的VARCHAR 长度,例如VARCHAR(500) 左右,并鼓励需要更大URL 的用户使用URL 缩短器,例如safe.mn

Twitter 方法: 对于非常好的用户体验,为过长的 URL 提供自动 URL 缩短器,并将链接的“显示版本”存储为带有省略号的 URL 的 sn-p在末尾。 (例如: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 存储在数据库中的某个地方才能工作? :-)
  • 当然;但我怀疑大多数人会编写自己的缩短器。自从写这篇文章以来,我了解到那里有许多 URL 缩短 API(这里列出了 71 个:programmableweb.com/news/…),因此您甚至可以在不编写自己的情况下自动化该过程。当然,这仍然取决于用户的知识和同意。
【解决方案5】:

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

使用 VARCHAR 和 maxlength >= 2,083micahwittman 建议,如果:

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

使用 TEXT 如果:

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

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

    • UTF-8 只需要占用更多空间吗?
    【解决方案7】:

    大多数浏览器都会让您输入very large amounts of data in a URL,因此很多事情最终都会创建非常大的 URL,因此如果您谈论的不仅仅是 URL 的域部分,您将需要使用 TEXT 列,因为 @987654322 @。

    【讨论】:

      【解决方案8】:

      我不知道其他浏览器,但IE7 has a 2083 character limit for HTTP GET operations。除非任何其他浏览器有更低的限制,否则我不明白为什么您需要超过 2083 个字符。

      【讨论】:

        【解决方案9】:

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

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

        有关使用大值数据类型的信息,请参阅 TechNet 上的 this article

        【讨论】:

        • varchar (max) 是 SQLServer 语法,不适合 MySQL(如原始问题所示)。此外,它并不意味着varchar (65535),因为 65535 是 mysql 中一行中 ASCII 字符的最大数量,因此它还取决于其他字段和字符集。
        【解决方案10】:

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

        【讨论】:

          猜你喜欢
          • 2011-10-09
          • 2014-02-28
          • 2011-07-22
          • 2013-08-27
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多