Tengo una tabla MySQL que almacena las URL como claves únicas. Estoy empezando a tener colisiones en mis llaves porque parece que las claves en sí mismas son solo los primeros 64 bytes (o caracteres si lo prefieres, es un latino-1 intercalado) de cualquier url. Entonces, si una url tiene más de 64 caracteres y ya tengo una url similar, arroja un error.Las claves únicas de MyISAM se cortan a 64 bytes, causando colisiones
Por ejemplo:
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'
Lanza este error:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elec' for key 'url'
¿No es MyISAM supone que tiene una longitud de clave de 1000 bytes?
EDIT: no parece que haya una longitud de prefijo aparece en la tabla de llamadas ESTADO DE CREAR se ve así:
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
traté de establecer una en 256 así:
ALTER TABLE `mydb`.`links`
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC) ;
y tengo el siguiente error:
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
Creo que el repliegue es sólo porque me encontré con la ALTE R TABLE a través de MySQL Workbench.
Haz un 'show create table' en tu tabla de enlaces. El índice probablemente se define con una longitud de 64. –