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

Duda declarar tipo de columna en tabla (tamaño)

Estas en el tema de Duda declarar tipo de columna en tabla (tamaño) en el foro de Mysql en Foros del Web. Buenas, Tengo una duda (tonta) que quiero asegurarme qué significa realmente esto id int(2) NOT NULL auto_increment, Mi duda no está en el auto_increment, sino ...
  #1 (permalink)  
Antiguo 07/11/2009, 04:27
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Duda declarar tipo de columna en tabla (tamaño)

Buenas,

Tengo una duda (tonta) que quiero asegurarme qué significa realmente esto

id int(2) NOT NULL auto_increment,

Mi duda no está en el auto_increment, sino es más básica aún. Que significa int(2)

Es la longitud de la columna en bytes?

Yo creo que es el tamaño en bytes, pero cuantos números se pueden crear en 2 bytes? :S

¿Es correcto el calculo 2 bytes = a 8bits por tanto 2^8 numeros? 256 numeros caben en un int(2) y por tanto en un int(3) se calcuaria siempre de la misma forma 3byes = 12bits >> 2^12 son los nuemros para int(3) ?¿?¿?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 07/11/2009, 07:53
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Duda declarar tipo de columna en tabla (tamaño)

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, no 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.
tomado de http://dev.mysql.com/doc/refman/5.0/...ric-types.html

Código mysql:
Ver original
  1. mysql> create table ad(id int(9));
  2. Query OK, 0 rows affected (0.01 sec)
  3.  
  4. mysql> insert into ad values(4);
  5. Query OK, 1 row affected (0.00 sec)
  6.  
  7. mysql> select *from ad;
  8. +------+
  9. | id   |
  10. +------+
  11. |    4 |
  12. +------+
  13. 1 row in set (0.00 sec)
  14.  
  15. mysql> drop table ad;
  16. Query OK, 0 rows affected (0.01 sec)
  17.  
  18. mysql> create table ad(id int(9) zerofill);
  19. Query OK, 0 rows affected (0.01 sec)
  20.  
  21. mysql> insert into ad values(4);
  22. Query OK, 1 row affected (0.00 sec)
  23.  
  24. mysql> select *from ad;
  25. +-----------+
  26. | id        |
  27. +-----------+
  28. | 000000004 |
  29. +-----------+
  30. 1 row in set (0.00 sec)
  31.  
  32. mysql>
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 07/11/2009, 07:56
Avatar de 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: Duda declarar tipo de columna en tabla (tamaño)

Eso se responde leyendo el Manual de Referencia: 11.2. Tipos numéricos.
El tipo de columna define el rango de representación. Ese otro valor tiene otro uso, y cito:
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, no 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.
Ejemplificando, si combinas en la declaración un INT(5) con ZEROFILL, y tienes ingresado un 23 en la tabla, al realizar el SELECT el resultado será 00023, en lugar de 23.
Fuera de eso, no tiene utilidad, pero el MySQL te lo pone por default al límite de representación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 07/11/2009, 15:30
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Duda declarar tipo de columna en tabla (tamaño)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Eso se responde leyendo el Manual de Referencia: 11.2. Tipos numéricos.
El tipo de columna define el rango de representación. Ese otro valor tiene otro uso, y cito:

Ejemplificando, si combinas en la declaración un INT(5) con ZEROFILL, y tienes ingresado un 23 en la tabla, al realizar el SELECT el resultado será 00023, en lugar de 23.
Fuera de eso, no tiene utilidad, pero el MySQL te lo pone por default al límite de representación.
Es decir, que según la tabla si yo declaro un

campo INT a secas puedo guardar 2147483647 números?

Y sí sé que no se va a llegar a 30000 registros puedo declarar

campo SMALLINT porque soporta hasta 32767 números y así ahorrar espacio en la bbdd?

Si es correcto esto... ya sé kung-fu :D

Muchas gracias de antemano
  #5 (permalink)  
Antiguo 07/11/2009, 15:52
Avatar de 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: Duda declarar tipo de columna en tabla (tamaño)

Cita:
Y sí sé que no se va a llegar a 30000 registros puedo declarar

campo SMALLINT porque soporta hasta 32767 números y así ahorrar espacio en la bbdd
Exactamente ese es el criterio para seleccionar los tipos de datos de las columnas: No menos de lo que se necesita, pero tampoco más de los necesarios.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 07/11/2009, 16:07
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Duda declarar tipo de columna en tabla (tamaño)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Exactamente ese es el criterio para seleccionar los tipos de datos de las columnas: No menos de lo que se necesita, pero tampoco más de los necesarios.
Genial, muchas gracias ;)
  #7 (permalink)  
Antiguo 07/11/2009, 17:01
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Duda declarar tipo de columna en tabla (tamaño)

Por cierto,

¿Hay algún inconveniente en declarar una columna como SMALLINT (para 32767) y luego a medida que pase el tiempo ver que se queda pequeña, se puede cambiar el tipo al siguiente MEDIUMINT (para 8388607) ?

Se perjudica/corrompe en algo la bbdd? es posible? sería haciendo un update?

Muchas gracias
  #8 (permalink)  
Antiguo 07/11/2009, 23:33
Avatar de 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: Duda declarar tipo de columna en tabla (tamaño)

No perjudica ni corrompe. Lo único que sucede es que se debe evitar modificar la estructura de una base de datos cuando la base ya está en funcionamiento, por los múltiples problemas que eso produce.
Entiéndase por problemas desde incompatibilidad de los backups realizados con anterioridad, hasta la necesidad de realizar cambios en las aplicaciones que usan las bases, pasando por tener que reeditar o cambiar casi siempre la mayoría de los procedimientos almacenados ya probados.
Es siempre mejor prepararse para el peor escenario de funcionamiento, ya que eventualmente el peor escenario (la experiencia me lo indica), suele ser aún peor de lo imaginado.
Como sugerencia, puntualmente respecto a los INT, si el campo en cuestión es un ID autoincremental, usa siempre como mínimo INT. Es muy fácil quedarse corto en ese caso.
El resto, depende del analisis, pero siempre piensa qué es lo peor que puede pasar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 08/11/2009, 03:36
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Duda declarar tipo de columna en tabla (tamaño)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No perjudica ni corrompe. Lo único que sucede es que se debe evitar modificar la estructura de una base de datos cuando la base ya está en funcionamiento, por los múltiples problemas que eso produce.
Entiéndase por problemas desde incompatibilidad de los backups realizados con anterioridad, hasta la necesidad de realizar cambios en las aplicaciones que usan las bases, pasando por tener que reeditar o cambiar casi siempre la mayoría de los procedimientos almacenados ya probados.
Es siempre mejor prepararse para el peor escenario de funcionamiento, ya que eventualmente el peor escenario (la experiencia me lo indica), suele ser aún peor de lo imaginado.
Como sugerencia, puntualmente respecto a los INT, si el campo en cuestión es un ID autoincremental, usa siempre como mínimo INT. Es muy fácil quedarse corto en ese caso.
El resto, depende del analisis, pero siempre piensa qué es lo peor que puede pasar.
Muchas gracias gnzsoloyo por la información
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 15:13.