MySQL整型字段匹配字符串是怎么回事?

MySQL整型字段匹配字符串是怎么回事?,mysql,Mysql,在我继承的数据库中,有时二进制问题编码为('Yes','No'),有时编码为(1,0)。我错误地查询了数字编码字段上的字符串“Yes”。我的猜测是MySQL将字符串转换为“0” 我有这样一个问题: SELECT `children_under_18` FROM `households` WHERE `children_under_18` = 'Yes' GROUP BY `children_under_18` 结果只匹配了18岁以下儿童为0的记录,这与我想要的正好相反。我知道我需要更加

在我继承的数据库中,有时二进制问题编码为('Yes','No'),有时编码为(1,0)。我错误地查询了数字编码字段上的字符串“Yes”。我的猜测是MySQL将字符串转换为“0”

我有这样一个问题:

SELECT `children_under_18`
  FROM `households`
 WHERE `children_under_18` = 'Yes'
 GROUP BY `children_under_18`

结果只匹配了
18岁以下儿童
为0的记录,这与我想要的正好相反。我知道我需要更加小心。我正在寻找一个关于发生了什么的明确答案。

字符串与数字相比总是转换为0(当然,包含数字+字符串的字符串被转换为数字。但这不是一个好的做法)

如果要存储二进制值(是/否或真/假)或小值集,
ENUM
是一个不错的选择。 它占用的磁盘空间很小,并且可以使用有意义的字符串

mysql> CREATE TABLE enum_test(a ENUM('Yes', 'No'));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into enum_test values('Yes'), ('No'), ('Invalid');
Query OK, 3 rows affected, 1 warning (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 1

mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'a' at row 3 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

mysql> select * from enum_test where a = 'Yes';
+------+
| a    |
+------+
| Yes  |
+------+
1 row in set (0.00 sec)

mysql> select * from enum_test where a = 'No';
+------+
| a    |
+------+
| No   |
+------+
1 row in set (0.00 sec)

18岁以下儿童的类型是什么。通常,数据库设计者选择将这种类型的值编码为enum('Yes','No')。我忘了这个字段的编码是什么,这就是我获得不想要的结果的方式。对于一个简单的布尔值,
ENUM
可能是合适的(尽管将无效值截断为特殊的空字符串值
'
,如上文所示,除了明确的
NULL
值(如允许)外,可能会提出其他建议).然而,在将Chris Komlenic的文章部署到生产系统之前,应该先阅读它。@eggyal这篇文章真是太棒了!事实上,我没有使用过
ENUM
,我只是很懒,但在未来,我永远不会使用它,即使很勤奋。
mysql> CREATE TABLE enum_test(a ENUM('Yes', 'No'));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into enum_test values('Yes'), ('No'), ('Invalid');
Query OK, 3 rows affected, 1 warning (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 1

mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'a' at row 3 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

mysql> select * from enum_test where a = 'Yes';
+------+
| a    |
+------+
| Yes  |
+------+
1 row in set (0.00 sec)

mysql> select * from enum_test where a = 'No';
+------+
| a    |
+------+
| No   |
+------+
1 row in set (0.00 sec)