TINYINT vs ENUM (0, 1) para valores booleanos en MySQL


¿Cuál es mejor, Tinyint con valores 0 y 1 o ENUM 0,1 en tablas MyISAM y MySQL 5.1?

Author: OMG Ponies, 2010-08-23

5 answers

Puede usar BIT(1) como se menciona en mysql 5.1 reference. no recomendaré enum o tinyint(1) as bit(1) solo necesita 1 bit para almacenar el valor booleano, mientras que tinyint(1) necesita 8 bits.

 22
Author: Adeel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-23 09:33:32

Mi investigación muestra que BIT(1) es un sinónimo de TINYINT(1) para versiones de MySQL anteriores a la 5.0.3.

Las versiones de MySQL posteriores a la 5.0.3 cambian el funcionamiento del tipo de datos de BITS. Ya no es sinónimo de TINYINT y es el único tipo de datos que le permite almacenar cualquier cosa en menos de un byte.

Este tipo de datos puede ser preferible a utilizar TINYINT o ENUM. Planeo probar para ver cuál es el más rápido y el uso del espacio de los tres en mi blog. Hay un enlace en la parte inferior si te importa vea los resultados de tamaño y velocidad. Banco de pruebas: penoso Pentium III box con OpenBSD y MySQL. (Con una caja de desarrollo DB más lenta, realmente puedes sentir los efectos del código incorrecto. Además, las diferencias entre las consultas de prueba son más discernibles. Alternativamente, intente usar una máquina virtual con apenas suficientes recursos asignados.)

La Documentación Oficial de MySQL.

El barón Schwartz tiene algo que decir al respecto.

Http://www.xaprb.com/blog/2006/04/11/bit-values-in-mysql /

 3
Author: BradChesney79,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-16 23:58:13

Sugeriría que la ENUMERACIÓN es preferible porque deja claro lo que se espera; si disminuye el rendimiento de una manera medible, me sorprendería mucho. Para hacer que un tinyint haga este trabajo se requeriría COMPROBAR una restricción en la columna; ninguno de los motores de almacenamiento MySQL actualmente soportan esto.

 1
Author: Brian Hooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-23 09:30:32

Enum, de alguna manera da una "pista" para desarrolladores o programadores. Pero por lo general, es mejor manejarlo programáticamente. Así que ya sea ENUM (0,1), BIT(1) Y TINYINT(1), todos usando 1 byte, sería mejor, en la mayoría de los casos, manejado en el lado del cliente, en lugar de enviar 2 en bit (1) o enum(0,1) al servidor y luego el servidor devolvería un error que tendrá que manejar de todos modos - usa más recursos (red + CPU del servidor + CPU del cliente x 2)

0 normalmente significa falso, 1 verdadero.

 1
Author: kalabog76,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-18 00:26:42

Para obtener los mejores requisitos de rendimiento y espacio , debe recopilar sus valores booleanos y guardarlos en el mismo TINYINT. Eg. Guarda hasta 8 valores booleanos en un TINYINT. 16 valores booleanos en un SMALLINT etc. Tanto BIT (1) como ENUM usan al menos 1 byte BIT(M) - approximately (M+7)/8 bytes ver: https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html . Entonces, si está almacenando 1 valor booleano, usaría TINYINT, ya que tiene la misma sobrecarga que BIT y ENUM, pero le da la opción de almacenar 7 más valores booleanos más adelante si es necesario.

 0
Author: Jens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-11 09:30:44