2 votes

MySQL tinyint vers boolean

J'ai donc un tinyint dans ma base de données où je stocke des valeurs de 0 a 2 .

D'après ce que j'ai compris, MySQL traite tout nombre non nul dans un fichier tinyint comme vraie (dans ce cas 1 y 2 ) et le 0 comme faux. Cependant, lorsque j'exécute une requête qui récupère certaines informations dans la table où se trouve l'élément tinyint la rangée est true , il ne fonctionne que pour les lignes qui ont 1 comme valeur. En d'autres termes, les lignes qui ont 2 en tant que valeur ne sont pas considérées comme true par la requête (et le 0 est considéré comme false ). L'interrogation se présenterait sous la forme suivante :

SELECT data FROM table WHERE active=true

active est de type tinyint et les valeurs suivantes lui ont été attribuées précédemment 0 , 1 o 2 selon le cas.

Je suis assez novice en matière de MySQL, donc je ne sais pas s'il y a un détail qui m'échappe, mais je n'arrive pas à comprendre pourquoi les données demandées ne sont pas renvoyées pour les lignes dont la valeur est 2. Je vous invite à me faire part de vos remarques.

5voto

GMB Points 188687

Pour MySQL, parce que 2 n'est ni 1 ni 0 entonces 2 n'est ni TRUE ni FALSE . Envisager :

SELECT 2 = TRUE, 2 = FALSE;

Cela renvoie :

| 2 = TRUE | 2 = FALSE |
| -------- | --------- |
| 0        | 0         |

Vous devrez exprimer la condition différemment, comme par exemple :

SELECT data FROM table WHERE active > 0

Cela fonctionnera également (toute valeur non nulle est considérée comme vraie, voir plus loin) :

SELECT data FROM table WHERE active;

Ce comportement est documenté dans le manuel qui stipule que

BOOL, BOOLEAN

Ces types sont des synonymes de TINYINT(1) . Une valeur de zéro est considérée comme fausse. Les valeurs non nulles sont considérées comme vraies.

mysql> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false                  |
+------------------------+

mysql> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+

mysql> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+

Toutefois, les valeurs TRUE y FALSE sont simplement des alias pour 1 et 0, respectivement, comme indiqué ici :

mysql> SELECT IF(0 = FALSE, 'true', 'false');
+--------------------------------+
| IF(0 = FALSE, 'true', 'false') |
+--------------------------------+
| true                           |
+--------------------------------+

mysql> SELECT IF(1 = TRUE, 'true', 'false');
+-------------------------------+
| IF(1 = TRUE, 'true', 'false') |
+-------------------------------+
| true                          |
+-------------------------------+

mysql> SELECT IF(2 = TRUE, 'true', 'false');
+-------------------------------+
| IF(2 = TRUE, 'true', 'false') |
+-------------------------------+
| false                         |
+-------------------------------+

mysql> SELECT IF(2 = FALSE, 'true', 'false');
+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false                          |
+--------------------------------+

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X