Ver Mensaje Individual
  #5 (permalink)  
Antiguo 16/12/2010, 05:50
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: como resuelvo este error 1264

El error es que ese valor (12) que estás poniendo en la definición del campo no tiene nada que ver con el rango de la columna. Eso representa otra cosa y no la cantidad de dígitos posibles. Esta es una confusión muy habitual.
El único tipo de campos donde ese valor representa la cantidad de digitos en es DECIMAL(m,n), DOUBLE(m,n) o FLOAT(m,n,), donde la m representa el ancho de la cifra, pero no es el caso de INT.
Yendo al manual (MySQL 5.0 Reference Manual :: 11 Tipos de columna :: 11.2 Tipos numéricos) podrás ver que:
Cita:
MySQL soporta otra extensión para especificar de forma óptima el ancho a mostrar de un tipo entero en paréntesis después de la palabra clave para el tipo (por ejemplo, INT(4)). Esta especificación opcional del ancho de muestra se usa para alinear a la izquierda la muestra de los valores con ancho menor que el ancho especificado para la columna.

El ancho de muestra no restringe el rango de valores que pueden almacenarse en la columna, sino el número de dígitos que se muestran para valores con ancho que exceda el especificado para la columna.

Cuando se usa en conjunción con el atributo de extensión opcional ZEROFILL, el relleno por defecto de espacios se reemplaza por ceros. Por ejmplo, para una columna declarada como INT(5) ZEROFILL, un valor de 4 se muestra como 00004. Tenga en cuenta que si almacena valores mayores que el ancho de muestra en una columna entera, puede tener problemas cuando MySQL genera tablas temporales para algunos joins complicados, ya que en estos casos MySQL cree que los datos encajan en el ancho original de la columna
(los resaltados son míos)

Lo que sucede en tu caso es que:

1) Estás desperdiciando la mitad del rango de datos porque estás usando un tipo numérico con signo para un dato numérico sin signo. Esto hace que sólo puedas almacenar datos entre el 0 y 2.147.483.647, y el que quieres poner es 96.946.793.478, obviamente mayor. De todos modos en este caso no resulta útil porque es mayor incluso que el rango de un INT UNSIGNED: 4.294.967.295.

2) Estás equivocando el tipo de columna si lo que quieres almacenar es un teléfono. Teléfonos, faxes, celulares, numero de documento o identificadores de ese tipo no se almacenan por razones prácticas como enteros sino como VARCHAR, porque los campos numéricos eliminan los ceros de a la izquierda de los mismos (regla aritmética aprendida en la primaria), que pueden ser importantes en ese tipo de datos. ¿Se entiende?

La solución (si no quieres usar VARCHAR) es cambiar el tipo INT por BIGINT UNSIGNED. Con eso te alcanzará (18.446.744.073.709.551.615).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 16/12/2010 a las 05:56