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

Tipo de dato int(). Dudas.

Estas en el tema de Tipo de dato int(). Dudas. en el foro de Mysql en Foros del Web. Buenas. El ancho de un tipo de dato es 4 bytes minimo?. Me confunde ver lo explicado en la http://dev.mysql.com/doc/refman/5.0/...ric-types.html con ejemplos de practica, ya ...
  #1 (permalink)  
Antiguo 13/06/2011, 06:40
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Tipo de dato int(). Dudas.

Buenas.

El ancho de un tipo de dato es 4 bytes minimo?. Me confunde ver lo explicado en la http://dev.mysql.com/doc/refman/5.0/...ric-types.html con ejemplos de practica, ya q veo ejemplos como int(11), int(255), etc.

La otra pregunta: si quiero q un campo int vaya de 0 a x, tengo q utilizar si o si el atributo unsigned?

Gracias.
  #2 (permalink)  
Antiguo 13/06/2011, 06:55
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, 4 meses
Puntos: 2658
Respuesta: Tipo de dato int(). Dudas.

Tu confusión es muy habitual, casi todos hacen la misma pregunta tarde o temprano.
Muchos creen que ese valor entre paréntesis representa la longitud de cifras del campo. No es así.
Vamos al manual:
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 ejemplo, 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.
Simplificando:
1) El rango de las cifras está dado por el tipo de columna, no por ese valor numérico.
2) Ese valor se usa en consultas en consola, para hacer que el número se alinee correctamente a la derecha, pero sólo importa si el número tiene menos cifras que el que indica en ese valor. Si la cifra es mayor, no tiene importancia.
3) Indicar un número inferior al máximo representable puede generar graves errores en ciertos casos, como generación de vistas, o tablas creadas sobre consultas, ya que MySQL interpreta que esa es la longitud real del número y puede generar errores de tipo de dato.
4) El sistema pone diferentes valores según sea o no UNSIGNED, porque los numeros con signo necesitan un espacio adicional para aquellos numeros que sean negativos, para el "-".

En esencia: Deja que el sistema le ponga la cifra que quiera, de todos modos no le pone ni le saca nada. Lo que no debes hacer es poner una más corta de lo que el sistema ponga, ya que eventualmente te puede crear errores no detectables.
Hay un post anterior mio sobre el tema con un ejemplo bastante claro del caso (http://www.forosdelweb.com/f86/difer...9/#post3681559).

Nota: Sólo en los DECIMAL, FLOAT o REAL, ese valor numérico significa longitud de la cifra.
__________________
¿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 13/06/2011, 07:38
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Tipo de dato int(). Dudas.

Gracias por la explicacion.

Cita:
Nota: Sólo en los DECIMAL, FLOAT o REAL, ese valor numérico significa longitud de la cifra.
Eso es lo q me confundia, pense q significaba la longitud de la cifra, pero igualmente sigo con dudas.

Me confunden los rangos con el ancho, me cuesta verlo o relacionarlo.

Si yo quiero q un id sea sin signo, bastaria algo asi?: id INT UNSIGNED PRIMARY KEY...
  #4 (permalink)  
Antiguo 13/06/2011, 08:00
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, 4 meses
Puntos: 2658
Respuesta: Tipo de dato int(). Dudas.

Rango es precisamente eso: los límites inferior y superior de un valor dado.
El rango de representación de un número se expresa desde cero si es sin signo, y desde su menor a su mayor números posiblles, si es con signo. El por qué un tipo de dato puede o no tener sigo es un problema que se estudia formalmente en las carreras universitarias. Es largo y exige muchas explicaciones.
La idea básica es que sólo puedes representar en una computadora valores cuyos rangos máximos sean potencias de dos, y por extensión, sólo valores que sean a la vez contenidos en un sistema de representación de 8 bits, por "palabra".
Eso hace que como sólo tienes 8 bits para un número mínimo, la mitad se usen para representar positivos y la otra mitad negativos. Como necesitas el cero, eventualmente uno de los dos rangos pierde un número para el cero. Por lo general es el de los positivos, por lo cual un TINYINT SIGNED va de -128 a + 127.
¿Se ve la idea?
Ahora bien, si usas un byte (8 bits) pero sin signo, la cosa cambia: va de 0 a 255 (256 combinaciones posibles, pero una es el cero).

Ahora bien, Como no puede en la realidad existir un ID cero, y jamás existirán IDs negativos, no tiene sentido crear un ID con una columna con signo: Perderías una mitad del rango, ya que jamás los podrías usar. Entonces, si vas a usar un número como ID, siempre será positivo y por tanto debes declararlo UNSIGNED.

¿Se entiende mejor?

Respecto al tema del valor entre paréntesis que te pone aunque no lo pongas, mira el link que te pasé y lo entenderás mejor.

Nota:

Los DECIMAL, FLOAT, etc., por definición de tipo de datos son siempre con signo. En el caso del primero y se debe indicar la longitud total de la cifra (punto y decimales incluidos) , pero no en FLOAT (que los acepta), porque DECIMAL es un tipo de dato de precisión, mientras que FLOAT es por aproximación.
Si vas a almacenar valores de dinero, usa DECIMAL, no FLOAT (recomendación del manual de referencia oficial).
__________________
¿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 13/06/2011, 08:14
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Tipo de dato int(). Dudas.

Q capo q sos, explicas re bien.
Veo la idea y voy entendiendo un poco mas, pero claro, voy a tener q practicar para amigarme con los tipos numericos.
A favoritos tu explicacion.
Saludos.
  #6 (permalink)  
Antiguo 13/06/2011, 08:27
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, 4 meses
Puntos: 2658
Respuesta: Tipo de dato int(). Dudas.

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: dato, dudas, int, tipo
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 11:50.