TRUE
i FALSE
są słowami kluczowymi i nie powinny być cytowane jako ciągi:
INSERT INTO first VALUES (NULL, 'G22', TRUE);
INSERT INTO first VALUES (NULL, 'G23', FALSE);
Cytując je jako łańcuchy, MySQL rzuci je na ich odpowiednik całkowity (ponieważ wartości logiczne to tak naprawdę jednobajtowy INT
w MySQL), co przekłada się na zero dla dowolnego ciągu nienumerycznego. W ten sposób otrzymujesz 0
dla obu wartości w Twojej tabeli.
Ciągi nienumeryczne rzutowane na zero:
mysql> SELECT CAST('TRUE' AS SIGNED), CAST('FALSE' AS SIGNED), CAST('12345' AS SIGNED);
+------------------------+-------------------------+-------------------------+
| CAST('TRUE' AS SIGNED) | CAST('FALSE' AS SIGNED) | CAST('12345' AS SIGNED) |
+------------------------+-------------------------+-------------------------+
| 0 | 0 | 12345 |
+------------------------+-------------------------+-------------------------+
Ale słowa kluczowe zwracają odpowiadające im INT
reprezentacja:
mysql> SELECT TRUE, FALSE;
+------+-------+
| TRUE | FALSE |
+------+-------+
| 1 | 0 |
+------+-------+
Zwróć też uwagę, że zastąpiłem podwójne cudzysłowy pojedynczymi cudzysłowami, podobnie jak bardziej standardowe obudowy ciągów SQL. Na koniec zamieniłem twoje puste ciągi na id
z NULL
. Pusty ciąg może spowodować ostrzeżenie.