Trabajando con el tipo de campo BIT de MySQL en PHP

BitsEl tipo de dato BIT en Mysql, antes de la versión 5.0.3 era almacenado como un TINYINT. En las versiones posteriores es utilizado para almacenar bits, y ya es soportado por los motores de almacenamiento MyISAM, Memory, InnoDB y NDBCluster. Al ser el tipo de dato de MySQL que se traduce como un booleano de los lenguajes de programación, es común usarlo para los campos en que almenamos información en que solo tiene dos estados: si es activo o no, si es apto o no, si es público o no, … No confundir con el tipo de datos BOOL, que en realidad es un TINYINT.

Al tipo de datos BIT se le puede especificar el número de bits, que va de 1 a 64. Si no se especifica, por defecto se toma que BIT solo contiene un bit. Para especificar los valores en MySQL, se puede utilizar una notación que muestro con el siguiente ejemplo, en que tengo una tabla de jugadores, con su ID que es un número y el vampo ‘lesionado’ que es un BIT(2):

INSERT INTO jugador (idjugador, lesionado)
	VALUES (1, b'01'), (2, b'11');

Existen otras notaciones para también pasar valores hexadecimales o octales. Para ver unos ejemplos, entrad en el siguiente enlace.

phpmyadmin-bitSi viéramos los valores desde el phpmyadmin, veríamos símbolos raros. En realidad intentan representar los valores del campo. Si hicieramos una consulta desde PHP a la base de datos, veriamos el mismo valor al hacer un echo o un var_dump. El valor que nos retorna es el carácter ASCii que concuerda con los bits almacenados.

Para poder trabajar con esos valores para hacer comparaciones o demás operaciones, necesitamos las funciones ord y chr de PHP. La función ord nos devuelve el número decimal de un carácter ASCii pasado por parámetro.

En el ejemplo, es una tontería usar 2 bits, ya que con un bit puedo guardar el estado, si esta lesionado o no el jugador. Pero he usado dos bits para que se entienda mejor que la función ord devuelve el valor decimal (’11’ en decimal es un 3).

$registros = mysql_query("SELECT idjugador, lesionado
				FROM jugador");
while ($reg = mysql_fetch_assoc($registros)) {
	echo $reg['idjugador'];
	if (ord($reg['lesionado']) == 1) {
		echo "No esta lesionado";
	}
	else if (ord($reg['lesionado']) == 3) {
		echo "Esta lesionado";
	}
}

Cuando queramos pasar un valor a la base de datos, ya sea para hacer un INSERT o un UPDATE, hemos de utilizar la función chr, que nos convierte un número decimal en su representación en ASCii.

mysql_query("UPDATE jugador
	SET lesionado = '" . chr(2) . "'
	WHERE idjugador=1");

Todo y las explicaciones, creo que no es muy recomendable usar este tipo de dato, principalmente por dos motivos:

  • Ocupa más espacio del número de bits que le asignamos
  • Necesita una transformación para ser utilitzado en PHP

Despendiendo de lo que necesitemos, sería más conveniente un TINYINT o un SET.

2 comentarios en “Trabajando con el tipo de campo BIT de MySQL en PHP

  1. Genial explicación estuve renegando un rato hasta que me di cuenta del problema viendo la tabla de valores de caracteres. Luego de solucionarlo me encontre con este artículo
    En pocas palabras los bits no son buenos amigos del PHP sobre todo por la cuestion de conversión

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>