2011-03-07 12 views
5

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.

+0

Haz un 'show create table' en tu tabla de enlaces. El índice probablemente se define con una longitud de 64. –

Respuesta

2

Cuando se crea un índice que sólo utiliza un prefijo (mediante la especificación de la longitud del índice), el prefijo puede ser hasta 1000 bytes (ver 7.5.1 Column Indexes). Use SHOW CREATE TABLE para conocer la longitud real del índice.

+0

De acuerdo con lo que @Oswald dijo. El documento oficial dice ([link] (http://dev.mysql.com/doc/refman/5.1/en/create-index.html)): 'Se pueden crear índices que usan solo la parte delantera de los valores de columna, usando la sintaxis col_name (length) para especificar una ... 'Encontré el mismo problema, pero no puedo encontrar ningún documento oficial que diga que está por defecto la longitud del prefijo del índice en 64 cuando el tamaño de los caracteres la columna like es gt 64 y no ha especificado la longitud del prefijo del índice. – lyfing

8

Creo que el mensaje de error solo muestra los primeros 64 caracteres, pero eso no significa que la restricción esté limitada a 64 caracteres.

Si su salida SHOW CREATE TABLE es precisa, entonces el índice está en los 500 caracteres, y está pulsando un duplicado exacto.

+1

También he visto este error truncado en 64 caracteres, cuando no tenía nada que ver con la longitud de la clave principal. (MySQL Ver 14.14 Distrib 5.1.61) – Flimm

Cuestiones relacionadas