我需要在MySQL表中存储一个URL。定义将包含长度不确定的URL的字段的最佳实践是什么?
我需要在MySQL表中存储一个URL。定义将包含长度不确定的URL的字段的最佳实践是什么?
Answers:
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)
VARCHAR(2083)
,只需使用即可TEXT
。
VARCHAR(512)
(或类似)应该足够。但是,由于您实际上并不知道所讨论的URL的最大长度,因此我可能直接转到TEXT
。这样做的危险当然是效率的损失,因为CLOB
s比简单的字符串数据类型(如)要慢得多VARCHAR
。
varchar(max)
对于SQLServer2005
varchar(65535)
适用于MySQL 5.0.3及更高版本
这将根据需要分配存储空间,并且不会影响性能。
max
一个神奇的ANSI SQL说明符,可以根据需要增加VARCHAR的大小,还是出于示例目的,它仅仅是一个元变量?
您将根据使用URL的频率以及是否实际需要绑定长度来在TEXT或VARCHAR列之间进行选择。
如果满足以下条件,则按照micahwittman的建议使用maxlength> = 2,083的VARCHAR:
如果满足以下条件,则使用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
)
注意事项和警告
大多数浏览器会允许您在URL中放入大量数据,因此很多事情最终会创建非常大的URL,因此,如果您谈论的内容超出URL的域部分,那么您将需要使用TEXT列,因为VARCHAR / CHAR是受限的。
我不了解其他浏览器,但是IE7的HTTP GET操作限制为2083个字符。除非其他浏览器没有更低的限制,否则我不明白为什么您需要的字符比2083多。
您最好使用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字符数,因此它还取决于其他字段和字符集。