URL的数据类型

时间:2010-11-16 06:03:28

标签: mysql

我读到URL的最大长度可以是2,000个字符。因此,我有一个varchar(2000)列类型的表来存储URL。但是此列不能仅索引前1000个字符,如下所示。 URL的推荐数据类型是什么?

mysql> create table myweb(id int not null auto_increment, url varchar(2000), primary key (id));
Query OK, 0 rows affected (0.03 sec)

mysql> alter table myweb add key (url);
Query OK, 1 row affected, 1 warning (0.04 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> show create table myweb\G
*************************** 1. row ***************************
       Table: myweb
Create Table: CREATE TABLE `myweb` (
  `id` int(11) NOT NULL auto_increment,
  `url` varchar(2000) default NULL,
  PRIMARY KEY  (`id`),
  KEY `url` (`url`(1000))
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

2 个答案:

答案 0 :(得分:3)

你的问题给想象留下了很多。

首先,我们必须假设您的索引的目的是作为避免重复的主键。您将不会开发一个曾经对用户说过的应用程序,“抱歉,您的1800个字符的数据输入中存在错误;它不匹配,请再试一次。”

另一方面,我们必须假设你的这些URL可能有很多CGI参数(?param = val& param = val& param = val)。

如果这些假设属实,那么这就是你能做的。

  1. 使您的网址列更长,作为varchar, 如果你需要。

  2. 添加SHA-1哈希 列到你的表。 SHA-1哈希 由40个字符的字符串组成 (hexdigits)。

  3. 将该列设为您的列 首要的关键。

  4. 当你把东西放进去的时候 你的表,使用mySQL SHA1 用于计算哈希值的函数。

  5. 使用INSERT ... ON DUPLICATE KEY UPDATE mySQL命令将行添加到数据库中。

  6. 这样,您就可以将重复的网址从数据库中保留下来,而不会出现混乱,并且可以很好地扩展。

    http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

答案 1 :(得分:1)

怎么样

alter table myweb create FULLTEXT INDEX on myweb_idx1(url);

虽然我必须同意zerkms,1000 char索引应该绰绰有余,考虑到你不太可能遇到比这更长的url,即使这样,1000 char前缀应该做得很好。

关于您的原始问题:我认为在varchars中保存URL是安全的。 这些网址来自哪里?谁是数据的制作者?你可以强制执行限制。

如果你正在网上抓取网址,那么你几乎肯定不会发生在2000年的网址上,因为我能想象到达那里的唯一方法就是使用GET数据。

希望这种漫无所事。