Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Error en PK varchar(350)

Estas en el tema de Error en PK varchar(350) en el foro de Mysql en Foros del Web. Hola. Tengo creada una tabla y quiero que un campo varchar(350), que es un dirección URL, un link vamos, sea PK. Me da este error: ...
  #1 (permalink)  
Antiguo 05/05/2013, 13:07
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Error en PK varchar(350)

Hola. Tengo creada una tabla y quiero que un campo varchar(350), que es un dirección URL, un link vamos, sea PK.

Me da este error:

#1071 - Specified key was too long; max key length is 1000 bytes

qué estoy haciendo mal?
  #2 (permalink)  
Antiguo 05/05/2013, 13:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error en PK varchar(350)

Es probable que uno o más valores existentes en la tabla estén creando problemas al ser leídos.
Revisa que solo contengan direcciones web sin parametrizaciones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 05/05/2013, 13:47
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: Error en PK varchar(350)

Qué quieres decir parametrizaciones?

Decir también que ya tengo una PK que es autonumérica. No sé si se pueden tener dos PK.
  #4 (permalink)  
Antiguo 05/05/2013, 14:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error en PK varchar(350)

Cita:
No sé si se pueden tener dos PK.
No existen las dobles PK. Una PK es no sólo un identificador único, sino que se usa para mantener el orden físico de los registros en disco. Por eso el sistema no admite dos.
¿Podrías ordenar en una biblioteca los libros de dos formas distintas al mismo tiempo?

Obviamente no. El libro es uno solo y ocupa un único espacio físico en un momento dado.
Bueno, en el disco pasa lo mismo con los registros.

Lo que si puedes hacer es crear índices UNIQUE sobre otro campo, tal que funciones como clave primaria alternativa y sea irrepetible.

Es decir: Crea un índice UNIQUE.

Eso si: Ten en cuenta que en un UNIQUE puede existe un registro donde ese campo sea NULL (es válido), pero sólo puede existir uno solo en la tabla, al igual que el resto de los registros, por lo que si la tabla tiene datos y existen dos registros con NULL o dos registros con caracter vacío, te reportará un error de ejecución y no podrá crear el índice.

¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 05/05/2013, 14:36
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: Error en PK varchar(350)

Se entiende perfectamente gnzsoloyo! Te lo agradezco. Lo único que he hecho pruebas y con varchar(350) no deja UNIQUE.

He probado en un tabla de prueba aparte y deja máximo varchar(333), es eso posible o estoy haciendo algo mal?
  #6 (permalink)  
Antiguo 05/05/2013, 14:40
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 20 años, 2 meses
Puntos: 71
Respuesta: Error en PK varchar(350)

Url sin parametización:
Código:
http://www.midominio.com
Url con parametización:

Código:
http://www.midominio.com/index.php?nombre=pepito&apellido=grillo&edad=88&ciudad=el%20bosque&telefono=999888777&otro_dato=cualquier%20cadena%20de%20mas%20de%20tresciento%20cincuenta%20caracteres%20eso%20si%puesto%20de%esta%20forma%20no%20parece%20que%20sean%20tantos%20verdad&otro_dato_mas=aqui%20podriamos%20seguir%20poniendo%20parametros%20para%20pasar%los%20trescientos%20cincuenta%20caracteres%20aunque%20ya%20los%20he%20pasado
  #7 (permalink)  
Antiguo 05/05/2013, 14:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error en PK varchar(350)

Cita:
Iniciado por humanista Ver Mensaje
Se entiende perfectamente gnzsoloyo! Te lo agradezco. Lo único que he hecho pruebas y con varchar(350) no deja UNIQUE.

He probado en un tabla de prueba aparte y deja máximo varchar(333), es eso posible o estoy haciendo algo mal?
La verdad no entiendo lo que dices.
¿Estás o no creando un índice UNIQUE? En ese caso ¿qué te dice MySQL?

Si la tabla contiene datos, ¿verificaste que no haya direcciones repetidas? ¿Verificaste que los campos no contengan nada que no sea una dirección del tipo "www.xxxxxxx.xx.xxx"o algo semejante? Es decir, sólo deben contener direcciones puras y no secuencias de caracteres o parámetros para acceder a páginas internas, que pueden generar rupturas en la interpretación de la cadena.
¿Se entiende esto último?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 05/05/2013, 14:54
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: Error en PK varchar(350)

Me da este error:

#1071 - Specified key was too long; max key length is 1000 bytes


Y sí, tengo enlaces tan raros como este:

http://feedproxy.google.com/~r/unaweb/~3/A4PYCrMJAAs/

Y con parámetros también. Contiene todo tipo de URL de lo más variopintas y raras.

De todas formas, como digo, en tabla aparte y vacía, no me deja crear UNIQUE de más de 333 caracteres varchar(333).

Lo que sí que me deja es crear un índice "normal" (no unique) pero... a pesar de que el campo es varchar (350), el índice me lo crea con varchar(333).

Raro, no?
  #9 (permalink)  
Antiguo 05/05/2013, 15:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error en PK varchar(350)

A mi entender, es un problema casi conceptual: Que declares el VARCHAR en 350 caracteres, no implica que el tamaño real se restrinja a esa longitud, por cuanto un VARCHAR puede contener hasta 65532 caracteres, lo que excede la longitud aceptable para una entrada de índice (1000 bytes).
Como el CREATE INDEX toma de referencia el rango total posible, no te está admitiendo la creación de un indice ocn un tamaño de clave variable que supere lo indicado.
La solución de manual sería que indexes definiendo cual es el tamaño que la entrada del índice debe tomar de referencia.
Código MySQL:
Ver original
  1. CREATE INDEX nombre_indice ON tabla(columa(n));
Donde "n" es un entero positivo que representa la logitud maxima declarada para ese campo en la tabla:
Código MySQL:
Ver original
  1. CREATE INDEX nombre_indice ON tabla(columa(350));

Prueba y me cuentas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 05/05/2013, 15:46
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: Error en PK varchar(350)

Pues acabo de hacer lo que me dices y me crea un índice pero NO único y con varchar(333), es decir lo mismo que si le doy directamente a "Agregar índice" (crear índice "normal") directamente en la tabla.
  #11 (permalink)  
Antiguo 05/05/2013, 15:52
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: Error en PK varchar(350)

Mirando la documentación se podría hacer así

CREATE UNIQUE INDEX nombreindice ON tabla(link(350));

pero me sale el mismo error:

#1071 - Specified key was too long; max key length is 1000 bytes
  #12 (permalink)  
Antiguo 05/05/2013, 15:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error en PK varchar(350)

Vamos a ver el lado práctico de lo que quieres lograr:
¿Qué es lo que deseas conseguir al hacer un ídice UNIQUE sobre un campo que contiene datos de esa clase? ¿No tener que validar las entradas o qué?
No es crear una PK, porque la PK ya la tienes...

Por otro lado, postea la consulta y la estructura de la tabla que estás usando tal y como la estás escribiendo tu.
Quiero verlas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 05/05/2013, 16:03
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: Error en PK varchar(350)

Lo que quiero es meter link de una web, título y descripción. Además, necesito el autonumérico.

El caso es que no quiero que se puedan ingresar dos links iguales. En teoría, tal y como lo tengo programado no debería poder suceder pero me quiero asegurar.

Para ello, primero compruebo si el link existe, si no existe hago un INSERT. Para el SELECT que comprueba si existe el link, entiendo que lo mejor es que el campo link sea un índice, ya que de esa forma se acelera el SELECT, no?

Aparte, también necesito el autonumérico para algunas consultas.

Espero haberme explicado.
  #14 (permalink)  
Antiguo 05/05/2013, 16:10
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Error en PK varchar(350)

Creo que el problema está explicado aquí:
http://bugs.mysql.com/bug.php?id=4521
si estás usando utf8 para ese campo, ese parece ser el problema. Puedes usar la codificación latin1 y probar
  #15 (permalink)  
Antiguo 05/05/2013, 16:16
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: Error en PK varchar(350)

Vaya jurena pues tenías razón, estaba usando utf-8 y bastó con cambiar a latin1, qué curioso! gracias a ti y a gnzsoloyo y a todos!!!

Última edición por humanista; 06/05/2013 a las 09:56

Etiquetas: tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:15.