我需要在MySQL表中存储一个url。定义包含不确定长度的URL的字段的最佳实践是什么?
当前回答
您应该使用带有ASCII字符编码的VARCHAR。url是百分比编码,国际域名使用punycode,所以ASCII就足够存储它们了。这将比UTF8占用更少的空间。
VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
其他回答
大多数web服务器都有URL长度限制(这就是为什么会有“URI过长”的错误代码),这意味着有一个实际的上限大小。找到最流行的web服务器的默认长度限制,并使用它们中最大的作为字段的最大大小;这应该绰绰有余。
您最好使用varchar(max),这(就大小而言)意味着varchar(65535)。 这甚至可以存储你更大的网址,也会节省你的空间。
max说明符扩展了varchar的存储能力, Nvarchar和varbinary数据类型。Varchar (max), nvarchar(max),和 Varbinary (max)统称为大值数据类型。你可以 使用大值数据类型存储最多2^31-1字节的数据。
请参阅TechNet上关于使用大值数据类型的文章
VARCHAR(512)(或类似)应该足够了。然而,由于您并不真正知道所讨论的url的最大长度,我可能只是直接进入TEXT。这样做的危险当然是效率的损失,因为clob比VARCHAR这样的简单字符串数据类型慢得多。
来自SQLServer2005的varchar(max)
varchar(65535)用于MySQL 5.0.3及以后版本
这将根据需要分配存储,并且不会影响性能。
您需要根据URL使用的频率以及是否需要解除长度的限制,在TEXT列或VARCHAR列之间进行选择。
使用VARCHAR maxlength >= 2083,如micahwittman建议,如果:
每个查询将使用许多url(与TEXT列不同,varchar与行内联存储) 您可以非常肯定URL永远不会超过65,535字节的行限制。
在以下情况下使用TEXT:
URL可能真的会打破65,535字节的行限制 您的查询不会一次(或经常)选择或更新一堆url。这是因为TEXT列只是内联保存一个指针,检索引用数据所涉及的随机访问可能是痛苦的。
推荐文章
- 如何关闭mysql密码验证?
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- MySQL区分大小写查询
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- MySQL数据库表中的最大记录数
- 原则-如何打印出真正的sql,而不仅仅是准备好的语句?
- PHP/MySQL插入一行然后获取id
- 从现有模式生成表关系图(SQL Server)
- 我如何循环通过一组记录在SQL Server?
- HyperLogLog算法是如何工作的?
- 数据库和模式的区别
- 如何从命令行通过mysql运行一个查询?