Mysql URL的数据类型

Mysql URL的数据类型,mysql,Mysql,我听说URL的最大长度可以是2000个字符。因此,我有一个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 m

我听说URL的最大长度可以是2000个字符。因此,我有一个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)
怎么样

alter table myweb在myweb上创建全文索引_idx1(url)

尽管我不得不同意zerkms的观点,1000个字符的索引应该足够了,考虑到你不太可能遇到比这更长的url,而且即使这样,1000个字符的前缀也应该做得很好

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

如果你在网络上搜索url,那么你几乎肯定不会遇到一个2000字符的url,因为我能想象得到的唯一方法就是使用GET数据

希望这些漫无边际的话有意义。

怎么样

alter table myweb在myweb上创建全文索引_idx1(url)

尽管我不得不同意zerkms的观点,1000个字符的索引应该足够了,考虑到你不太可能遇到比这更长的url,而且即使这样,1000个字符的前缀也应该做得很好

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

如果你在网络上搜索url,那么你几乎肯定不会遇到一个2000字符的url,因为我能想象得到的唯一方法就是使用GET数据


希望这个漫无边际的问题有意义。

你的问题留给我们很多想象

首先,我们必须假设索引的目的是作为主键,以避免重复。您开发的应用程序不会对用户说:“对不起,1800个字符的数据输入有错误;不匹配,请重试。”

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

如果这些假设是真的,那么下面是你能做的

  • 使URL列变长,如varchar, 如果你需要的话

  • 添加一个SHA-1散列 列添加到表中。SHA-1散列 由40个字符的字符串组成 (十六位数)

  • 让那个专栏成为你的专栏 主键

  • 当你把东西放进 在您的表中,使用mySQL SHA1 函数来计算散列值

  • 使用插入。。。在重复键更新mySQL命令上,向数据库添加行

  • 这将使您能够以一种可以很好地扩展的方式将重复的URL保留在数据库之外,而不会产生混乱


    你的问题让人想像力很大

    首先,我们必须假设索引的目的是作为主键,以避免重复。您开发的应用程序不会对用户说:“对不起,1800个字符的数据输入有错误;不匹配,请重试。”

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

    如果这些假设是真的,那么下面是你能做的

  • 使URL列变长,如varchar, 如果你需要的话

  • 添加一个SHA-1散列 列添加到表中。SHA-1散列 由40个字符的字符串组成 (十六位数)

  • 让那个专栏成为你的专栏 主键

  • 当你把东西放进 在您的表中,使用mySQL SHA1 函数来计算散列值

  • 使用插入。。。在重复键更新mySQL命令上,向数据库添加行

  • 这将使您能够以一种可以很好地扩展的方式将重复的URL保留在数据库之外,而不会产生混乱


    “但本专栏不能仅为前1000个字符编制索引”——那么?2000个字符不是URL的最大长度,尽管它远远超出了URL的合理长度;任何超过几百个的都至少不是用户友好的,如果不是彻头彻尾的用户敌意的话。不同版本的IE都有超过2000个的限制,其他浏览器也有不同的限制。“但是这个专栏不能只索引前1000个字符”——那么呢?2000个字符不是URL的最大长度,尽管它远远超出了URL的合理长度;任何超过几百个的都至少不是用户友好的,如果不是彻头彻尾的用户敌意的话。不同版本的IE都有超过2000的限制,其他浏览器也有不同的限制。我认为在复制版上,他必须检查手头的url和存储的url,以检查两者是否相同,以解决哈希冲突的可能性。我知道这是旧的,但这个答案基本上是正确的。小心。这可能会产生冲突,避免您添加一个新的url,而实际上它并不存在。这很少见,但也有可能发生。还要检查另一个答案:我认为在复制时,他必须检查手上的url和存储的url,以检查两者是否相同,以解决哈希冲突的可能性。我知道这是旧的,但这个答案基本上是正确的。小心。这可能会产生冲突,避免您添加一个新的url,而实际上它并不存在。这很少见,但也有可能发生。另请检查其他答案: