Уникальные ключи MyISAM обрезаются по 64 байта, вызывая коллизии - PullRequest
5 голосов
/ 07 марта 2011

У меня есть таблица MySQL, в которой URL-адреса хранятся в виде уникальных ключей.Я начинаю сталкиваться с моими ключами, потому что кажется, что сами ключи являются только первыми 64 байтами (или символами, если вы предпочитаете, это с латинскими цифрами-1) любого URL.Поэтому, если 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 байт?

EDIT: Кажется, что длина префикса, указанная в вызове 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

Я думаю, что откат произошел только потому, что я запустил ALTER TABLEчерез MySQL Workbench.

Ответы [ 2 ]

9 голосов
/ 07 марта 2011

Я думаю, что сообщение об ошибке показывает только первые 64 символа, но это не значит, что ограничение ограничено 64 символами.

Если вывод SHOW CREATE TABLE является точным, тогда индекс равенна все 500 символов, и вы попали в точную копию.

2 голосов
/ 07 марта 2011

Когда вы создаете индекс, который использует только префикс (указав длину индекса), тогда префикс может быть до 1000 байтов (см. 7.5.1 Индексы столбцов ).Используйте SHOW CREATE TABLE, чтобы узнать фактическую длину индекса.

...