我读到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)
答案 0 :(得分:3)
你的问题给想象留下了很多。
首先,我们必须假设您的索引的目的是作为避免重复的主键。您将不会开发一个曾经对用户说过的应用程序,“抱歉,您的1800个字符的数据输入中存在错误;它不匹配,请再试一次。”
另一方面,我们必须假设你的这些URL可能有很多CGI参数(?param = val& param = val& param = val)。
如果这些假设属实,那么这就是你能做的。
使您的网址列更长,作为varchar, 如果你需要。
添加SHA-1哈希 列到你的表。 SHA-1哈希 由40个字符的字符串组成 (hexdigits)。
将该列设为您的列 首要的关键。
当你把东西放进去的时候 你的表,使用mySQL SHA1 用于计算哈希值的函数。
使用INSERT ... ON DUPLICATE KEY UPDATE mySQL命令将行添加到数据库中。
这样,您就可以将重复的网址从数据库中保留下来,而不会出现混乱,并且可以很好地扩展。
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数据。
希望这种漫无所事。