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

[SOLUCIONADO] Tipo de datos Tintyint

Estas en el tema de Tipo de datos Tintyint en el foro de Mysql en Foros del Web. Buenas, seguramente ya hayan respondido a esta pregunta pero no paro de buscar tanto en foros como en la documentación de Mysql y no encuentro ...
  #1 (permalink)  
Antiguo 22/02/2014, 04:32
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Tipo de datos Tintyint

Buenas,
seguramente ya hayan respondido a esta pregunta pero no paro de buscar tanto en foros como en la documentación de Mysql y no encuentro la respuesta.
Mi pregunta es, que quiero almacenar un tipo bool, es decir, 0 o 1.
En primer lugar he usado el tipo BIT ya que a partir de la versión 5.0.3 de mysql esta disponible y uso la 5.5.24.
Pero cuando asigno un valor me dice que fuera de rango, ni 0 ni 1.
Por otro lado, intento usar el tipo tinyint que es como se hacia antes que existiera el tipo BIT y claro, esto me serviría pero me almacenaría del 0 al 255 poniéndolo unsigned, pero independiente del tamaño que le ponga, es decir, si pongo un tintyint(1) me almacena también hasta el valor 255.
Quizás no entiendas bien en que consiste el tamaño, o no se...

Si alguien me puede ayudar en el tema se lo agradecía.
Un saludo!
  #2 (permalink)  
Antiguo 22/02/2014, 05:41
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: Tipo de datos Tintyint

Cita:
En primer lugar he usado el tipo BIT ya que a partir de la versión 5.0.3 de mysql esta disponible y uso la 5.5.24.
Pero cuando asigno un valor me dice que fuera de rango, ni 0 ni 1.
Esto que dices no tiene mucho sentido. No deberías tener problemas al ingresar un 0/1, ya que eso es lo que espera ese tipo de dato.
Posteanos la query tal como la usas para insertar, para ver lo que está sucediendo.
Cita:
Por otro lado, intento usar el tipo tinyint que es como se hacia antes que existiera el tipo BIT y claro, esto me serviría pero me almacenaría del 0 al 255 poniéndolo unsigned, pero independiente del tamaño que le ponga, es decir, si pongo un tintyint(1) me almacena también hasta el valor 255.
Tengo la impresión de que tu problema tiene que ver con el "rango" que los manuales indican al crear una columna, y en ese sentido lo que tienes es un error involuntario.
Código MySQL:
Ver original
  1. columna(1) TINYINT
El (1) no indica que esa columna vaya a tener un único dígito. Ese valor no restringe el rango de representación del TINYINT (ni de ningún número entero). Se usa para otra cosa.


¿Podrías postear el CREATE TABLE de tu tabla?

Código MySQL:
Ver original 
__________________
¿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 22/02/2014, 05:49
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Tipo de datos Tintyint

Este es mi código:

CREATE TABLE IF NOT EXISTS `sala` (
`id` tinyint(2) unsigned NOT NULL AUTO_INCREMENT,
`nom` varchar(25) NOT NULL,
`descrip` text NOT NULL,
`planta` enum('Baja','Primera','Segunda','Tercera','Cuarta' ) NOT NULL,
`uso` tinyint(1) unsigned NOT NULL DEFAULT '0',
`img` varchar(65) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `nombre` (`nom`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

sería la variable uso.
Ahora la intento añadir y me muestra cuando selecciono el tipo BIT un popup con un mensaje de: ¡Esto no es un número! Ya le introduzca alguna longitud o no... y antes me ha dejado... que raro...

Vamos en conclusion es lo que quiero almacenar en la variable uso si es 1 o 0 porque como la tengo en el create table me admite por ejemplo el valor 52...
  #4 (permalink)  
Antiguo 22/02/2014, 05:52
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Tipo de datos Tintyint

Perdona, ahora me ha dejado... cosas raras...
Te adjunto el código:
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `sala` (
  2.   `nom` varchar(25) NOT NULL,
  3.   `descrip` text NOT NULL,
  4.   `planta` enum('Baja','Primera','Segunda','Tercera','Cuarta') NOT NULL,
  5.   `uso` tinyint(1) unsigned NOT NULL DEFAULT '0',
  6.   `img` varchar(65) DEFAULT NULL,
  7.   `uso1` bit(1) NOT NULL,
  8.   PRIMARY KEY (`id`),
  9.   UNIQUE KEY `id` (`id`),
  10.   UNIQUE KEY `nombre` (`nom`)
Y cuando introduzco 1 por ejemplo me pone:
0 filas afectadas.
Warning: #1264 Out of range value for column 'uso1' at row 1

Última edición por gnzsoloyo; 22/02/2014 a las 06:00
  #5 (permalink)  
Antiguo 22/02/2014, 06:05
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: Tipo de datos Tintyint

Postea una muestra de la query usada.
Tengo la impresión de que el problema pueda estar causado por el modo de inserción del dato.
__________________
¿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 22/02/2014, 06:19
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Tipo de datos Tintyint

Ya lo solucioné, lo que me pasaba es que intentaba cambiar el valor de forma iterativa y no te deja, me da el fallo ese que te comenté,

Ahra hice la inserción:
INSERT INTO `grcalvosl`.`sala` (`id`, `nom`, `descrip`, `planta`, `uso`, `img`, `uso1`) VALUES ('17', 'Sala de Espera2', 'Es muy bonitaa!!', 'Segunda', '0', NULL, b'0')

y va perfecto!

Muchas grcias por tu ayuda!
  #7 (permalink)  
Antiguo 22/02/2014, 06:23
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: Tipo de datos Tintyint

Bueno, ahora te lo aclaro entonces:
No puedes poner el uno (1) entre comillas sin indicar la "b" de bit, porque se va de rango.
Miremosló así y verás el efecto:
Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS t;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> CREATE TABLE t (b BIT(1));
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> INSERT INTO t VALUES(b'0');
  8. Query OK, 1 row affected (0.02 sec)
  9.  
  10. mysql> INSERT INTO t VALUES(b'1');
  11. Query OK, 1 row affected (0.00 sec)
  12.  
  13. mysql> INSERT INTO t VALUES('1');
  14. ERROR 1406 (22001): Data too long for column 'b' at row 1
  15. mysql> INSERT INTO t VALUES(1);
  16. Query OK, 1 row affected (0.00 sec)
  17.  
  18. mysql> SELECT (b+0) b FROM t;
  19. +------+
  20. | b    |
  21. +------+
  22. |    0 |
  23. |    1 |
  24. |    1 |
  25. +------+
  26. 3 rows in set (0.00 sec)
Si en lugar de un sólo bit, pongo más, podemos ver el número que realmente se generaba:
Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS t;
  2. Query OK, 0 rows affected (0.01 sec)
  3.  
  4. mysql> CREATE TABLE t (b BIT(8));
  5. Query OK, 0 rows affected (0.05 sec)
  6.  
  7. mysql> INSERT INTO t VALUES(b'0');
  8. Query OK, 1 row affected (0.00 sec)
  9.  
  10. mysql> INSERT INTO t VALUES(b'1');
  11. Query OK, 1 row affected (0.00 sec)
  12.  
  13. mysql> INSERT INTO t VALUES('1');
  14. Query OK, 1 row affected (0.00 sec)
  15.  
  16. mysql> INSERT INTO t VALUES(1);
  17. Query OK, 1 row affected (0.00 sec)
  18.  
  19. mysql> SELECT (b+0) b FROM t;
  20. +------+
  21. | b    |
  22. +------+
  23. |    0 |
  24. |    1 |
  25. |   49 |
  26. |    1 |
  27. +------+
  28. 4 rows in set (0.00 sec)
¿Ver cómo el "1" se transforma en 49?
Es porque sin el bit se interpreta como caracter "1" y hace una conversión implícita según charset.
Mi sugerencia sería que si quieres usar la sintaxis ortodoxa, bien, pero de lo contrario, pon los números sin apóstrofos.
__________________
¿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 22/02/2014, 06:29
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Tipo de datos Tintyint

Ahhh vale, te comprendo.
Entonces para indicar que es un bit y no un carácter se especifica poniendo la b delante del valor que quiera poner(0 o 1).

Yo en las inserciones cuando son datos de tipo numérico lo pongo sin apóstrofos, que sería la forma correcta según me indicas?

Muchas gracias por tu explicación.
  #9 (permalink)  
Antiguo 22/02/2014, 06:34
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: Tipo de datos Tintyint

Si ves la muestra que tomé de ejemplo, verás que con sólo poner 1 ó 0 alcanza para que lo tome.
Usar la "b" previa es obligatorio sólo si vas a ingresar el valor como binario (el 3 = b'11', 6 = b'110', 129 = b'10000001').
Manual de referncia:
Cita:
Para especificar valores bit, puede usar la notación b'value' . value es un valor binario escrito usando ceros y unos. Por ejemplo, b'111' y b'100000000' representan 7 y 128, respectivamente. Consulte Sección 9.1.5, “Valores de bits”.

Si asigna un valor a una columna BIT(M) con menos de M bits , el valor se alinea a la izquierda con ceros. Por ejemplo, asignar un valor b'101' a una columna BIT(6) es, en efecto, lo mismo que asignar b'000101'.
Ejemplo en manual:
http://dev.mysql.com/doc/refman/5.0/...ld-values.html
__________________
¿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 22/02/2014, 06:38
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Tipo de datos Tintyint

Si ya me di cuenta! Eres un crack!
Muchas gracias!!
  #11 (permalink)  
Antiguo 24/02/2014, 03:33
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Tipo de datos Tintyint

Perdona mi ignorancia gnzsoloyo, pero porque cuando pongo un atributo de tipo tinyint(2) me admite por ejemplo el numero 100..??
Eso es que no lo termino de ver...
  #12 (permalink)  
Antiguo 24/02/2014, 03:50
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Tipo de datos Tintyint

Ya encontré tu explicación en el foro!
Veo que el tamaño ese es irrelevante, solo sirve para el modo consola!
muchas gracias!

Etiquetas: sql, 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 08:08.