5

我有一个 MySQL 表,将 url 存储为唯一键。我开始在我的键上遇到冲突,因为键本身似乎只是任何 url 的前 64 个字节(或者如果您愿意,它是一个 latin-1 排序的字符)。因此,如果一个 url 超过 64 个字符并且我已经有一个类似的 url,它会抛出一个错误。

例如:

SELECT l.link_id FROM mydb.links l WHERE 
url = 'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elected_Me_as_Their_Leader/index.html'

引发此错误:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 
'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elec' for key 'url'

MyISAM 不应该有 1000 字节的密钥长度吗?

编辑: CREATE TABLE STATUS 调用中似乎没有列出前缀长度,它看起来像这样:

CREATE TABLE `links` (
  `link_id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(500) NOT NULL,
  PRIMARY KEY (`link_id`),
  UNIQUE KEY `url` (`url`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

我尝试将一个设置为 256,如下所示:

ALTER TABLE `mydb`.`links` 
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC) ;

我收到以下错误:

ERROR 1062: Duplicate entry '<...64-byte key...>' for key 'url'
SQL Statement:
ALTER TABLE `mydb`.`links` 
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC)

ERROR: Error when running failback script. Details follow.

ERROR 1050: Table 'links' already exists

我认为回退只是因为我通过 MySQL Workbench 运行了 ALTER TABLE。

4

2 回答 2

10

我认为错误消息只显示前 64 个字符,但这并不意味着约束仅限于 64 个字符。

如果您的SHOW CREATE TABLE输出是准确的,那么索引就在所有 500 个字符上,并且您遇到了完全相同的副本。

于 2011-03-07T20:25:08.040 回答
2

当您创建仅使用前缀的索引时(通过指定索引的长度),前缀最多可以是1000 个字节(请参阅7.5.1 列索引)。用于SHOW CREATE TABLE找出索引的实际长度。

于 2011-03-07T19:27:36.767 回答