¿Leíste el link que te pasé?
Es bastante aclaratorio de tu duda, pero de todos modos vamos ahacer unaintroducción:
En las bases de datos, y en especial hablando de MySQL,
los números no se almacenan como cifras, sino como números binarios. De este modo se puede usar sólo 8 bytes para representar un número que en realidad tiene 20 dígitos.
Pero si lees sobre representación o codificacion de números en binario, sabrás que en binario
no existen los numeros negativos, pero como el mudo real si, se debió hacer una forma de convención que permita realizar operaciones con negativos, y que sea sportada en binario.
¿Cómo?
Bueno, se resolvió dedicar la mitad del rango de un numero binario a los positivos y otro a los negativos, más el cero (el cero tambien tiene que ser representado).
Ahora bien, las computadoras trabajan con longitudes de palabra que determinan por convención que la menor representacion codificada es un Byte, el cual se estableció en 8 bits.
El rango es: 00000000 a 11111111.
El 11111111 es el binario de 255, mientras que el otro es el cero.
Cuando quieres representar los negativos haces que todos los que comienzan con 1 en el primer bit sean negativos y el resto positivos:
Cita: (1) 1111111 = -128
(0) 0000000 = 0
(0) 1111111 = 127
De alli que haya más negativos que positivos en la representación de números con signo.
Entonces MySQL definió cinco tipos de números enteros:
Cita: TINYINT = 1 Byte (8 bits)
SMALLINT = 2 Bytes (16 bits)
MEDIUMINT = 3 Bites (24 bits)
INT = 4 Bytes (32 bits)
BIGINT = 8 Bytes (64 bits).
En consecuencia lo que define el rango de representación de un número en MySQL
es el tipo de dato, no otra cosa.
Ahora bien, para entenderlo correctamente, veamos lo que dice el manual:
Cita: Con signo:
TINYINT: -128 a 127
SMALLINT: -32768 a 32767
MEDIUMINT: -8388608 a 8388607
INT: -2147483648 a 2147483647
BIGINT: -9223372036854775808 a 9223372036854775807
Sin signo:
TINYINT: 0 a 255
SMALLINT: 0 a 65535
MEDIUMINT: 0 a 16777215
INT: 0 a 4294967295
BIGINT: 0 a 18446744073709551615
Como verás, en cada caso hay un máximo de dígitos representables, pero también un valor máximo, pero lo que vale a la hora de los números es el tipo de dato.
Entonces, ¿qué significa ese numerito absurdo en la definición del dato?
En realidad nada útil. A mi entender MySQL debería eliminarlo porque sólo produce confusiones, pero yendo al manual el tema es así:
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 replaza 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.
Todos los tipos enteros pueden tener un atributo opcional (no estándar) UNSIGNED. Los valores sin signo pueden usarse cuando quiere permitir sólo números no negativos en una columna y necesita un rango numérico mayor para la columna.
Ese "ancho a mostrar" sólo tiene efectos reales en las operaciones de SQL que se hacen sobre consola de MySQL, y no cuando aplicas SQL a través de una aplicación.
Por otra parte hay un efecto secundario y es que esa definición extra de la columna se usa luego cuando se utilizan VIEWs, donde MySQL se referencia a esa definición para realizar ciertas operaciones. Por esa razon
no es conveniente jamás indicar un ancho menor al máximo representable del tipo de dato, ya que luego pueden generarse pérdida de datos, o recortes de representación con efectos impredecibles.
Si los quieres usar, dejale el valor por default. No lo manipules.
¿Se va entendiendo algo?