我需要在MySQL表中存储一个url.定义一个包含未确定长度的URL的字段的最佳做法是什么?
流行的Web浏览器中最低公分母最大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字节,在所有列之间共享)和使用的字符集的限制.所以...
TEXT
或
> = MySQL 5.0.3使用VARCHAR(2083)
VARCHAR(512)
(或类似的)应该足够了.但是,由于您实际上并不知道相关网址的最大长度,我可能会直接指向TEXT
.这样做的危险当然是效率的降低,因为CLOB
s比简单的字符串数据类型慢得多VARCHAR
.
varchar(max)
对于SQLServer2005
varchar(65535)
对于MySQL 5.0.3及更高版本
这将根据需要分配存储,不应影响性能.
您需要根据URL的使用频率以及是否确实需要将长度保持为未绑定来在TEXT或VARCHAR列之间进行选择.
使用VARCHAR,maxlength> = 2,083,如micahwittman建议的那样:
您将在每个查询中使用大量URL(与TEXT列不同,VARCHAR与行内联存储)
您非常确定URL永远不会超过65,535字节的行限制.
使用TEXT如果:
URL确实可能会破坏65,535字节的行限制
您的查询不会一次(或经常)选择或更新一堆URL.这是因为TEXT列只是内联指针,并且检索引用数据所涉及的随机访问可能很痛苦.
您应该使用带有ASCII字符编码的VARCHAR.URL是编码百分比,国际域名使用punycode,因此ASCII足以存储它们.这将比UTF8使用更少的空间.
VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
这实际上取决于您的用例(请参阅下文),但是存储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缩短器。