2010-11-16 26 views
1

我看到URL的最大長度可以是2000個字符。因此,我有一個varchar(2000)列類型的表來存儲URL。但是這個列不能僅索引前1000個字符,如下所示。什麼是推薦的URL數據類型?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) 
+1

「但是,這列不能索引只有前1000個字符」 ---這樣的嗎?對你來說不夠嗎? – zerkms 2010-11-16 06:05:20

+1

2000字符不是URL的最大長度,儘管它遠遠超出了URL的合理長度;如果不是用戶的敵對行爲,那麼任何超過幾百的數據都至少不是用戶友好的。各種版本的IE的限制略超過2000,其他瀏覽器有不同的限制。 – 2010-11-16 06:08:57

回答

3

你的問題留下很多想象力。

一方面,我們必須假設您的索引的目的是作爲避免重複的主鍵。你不會開發一個對用戶說過的應用程序,「對不起,你的1800字符數據輸入存在錯誤;它不匹配,請重試。」

另一方面,我們必須假設您的這些URL可能具有很多CGI參數(?param = val & param = val & param = val)。

如果這些假設是真實的,那麼這裏是你可以做的。

  1. 如果需要,可以使URL列更長,如varchar, 。

  2. 向您的表添加SHA-1散列 列。 SHA-1哈希 由40個字符的字符串組成(數字十六進制)。

  3. 使該列成爲您的 主鍵。

  4. 當你把東西放到 你的表中時,使用mySQL SHA1 函數來計算散列值。

  5. 使用INSERT ... ON DUPLICATE KEY UPDATE mySQL命令將行添加到數據庫。

這樣可以讓您將重複的URL保留在您的數據庫之外而不會混淆,而且可以很好地擴展。

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

+0

我想重複一遍,他必須手工檢查url並存儲url以檢查兩者是否相同以解決哈希的碰撞機會。 – 2011-09-15 01:46:32

+0

我知道這是舊的,但這個答案是最正確的。小心點。這可能會造成衝突,避免您添加一個新的網址,因爲它實際上並不存在。這很少見,但可能會發生。檢查此其他答案:http://stackoverflow.com/questions/6800866/how-to-store-urls-in-mysql – 2012-11-18 19:50:20

1

如何

雖然我有zerkms同意,1000字符的索引應該是綽綽有餘,考慮到一個事實,你是不太可能遇到一個url長於即使如此,1000字符前綴也應該做得很好。

關於你原來的問題:我認爲用varchars保存URL是安全的。 這些網址來自哪裏?誰是數據的製作者?你可以強制執行限制。

如果您爲網址抓取網址,那麼您幾乎肯定不會發生2000個字符網址,導致我可以想象得到的唯一方法是使用GET數據。

希望這個散漫是有道理的。