MySQL SELECT查询包含NULL的位字段和字符串字段比较,返回空集

MySQL SELECT查询包含NULL的位字段和字符串字段比较,返回空集,mysql,sql,select,null,bit,Mysql,Sql,Select,Null,Bit,我有一个表,其结构如下: mysql> desc services; +----------------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------------+-------------+------+-----+---------+-------+ |

我有一个表,其结构如下:

mysql> desc services;
+----------------------+-------------+------+-----+---------+-------+
| Field                | Type        | Null | Key | Default | Extra |
+----------------------+-------------+------+-----+---------+-------+
| uuid                 | binary(16)  | NO   | PRI | NULL    |       |
| service_number       | varchar(15) | YES  | UNI | NULL    |       |
| mobile_imsi          | varchar(15) | YES  | UNI | NULL    |       |
| mobile_uid           | varchar(10) | YES  | UNI | NULL    |       |
| account_uuid         | binary(16)  | YES  | MUL | NULL    |       |
| create_date          | bigint(20)  | YES  |     | NULL    |       |
| service_provider_id  | varchar(4)  | YES  |     | NULL    |       |
| service_provider     | varchar(10) | YES  |     | NULL    |       |
| service_carrier_code | varchar(2)  | YES  |     | NULL    |       |
| service_technology   | varchar(10) | YES  |     | NULL    |       |
| mobile_msa           | char(2)     | YES  |     | NULL    |       |
| mica_acct_seq        | varchar(4)  | YES  |     | NULL    |       |
| payment_type         | char(1)     | YES  | MUL | NULL    |       |
| price_plan           | varchar(20) | YES  |     | NULL    |       |
| strategic_flag       | bit(1)      | YES  |     | NULL    |       |
| app_term_sms_flag    | bit(1)      | YES  |     | NULL    |       |
| modify_date          | bigint(20)  | YES  |     | NULL    |       |
| ported_flag          | bit(1)      | YES  |     | NULL    |       |
| prbt_barred_flag     | bit(1)      | YES  |     | NULL    |       |
+----------------------+-------------+------+-----+---------+-------+
19 rows in set (0.02 sec)
第一个问题:

mysql> select service_number, mobile_imsi, hex(ported_flag) from services where hex(ported_flag) is not null and mobile_imsi is null;
Empty set (0.01 sec)
第二个问题:

mysql> select service_number, mobile_imsi, hex(ported_flag) from services where hex(ported_flag) is not null and ifnull(mobile_imsi,0) = '0';
+----------------+-------------+------------------+
| service_number | mobile_imsi | hex(ported_flag) |
+----------------+-------------+------------------+
| 0411720032     | NULL        | 1                |
| 0419269667     | NULL        | 1                |
| 0400000040     | NULL        | 1                |
+----------------+-------------+------------------+
3 rows in set (1.58 sec)

第一个导致MySQL不返回结果的查询是什么?我的直觉是,查询中的位字段在某种程度上是原因的一部分,但我不理解为什么这里的IFNULL函数允许它返回正确的结果集,而一个简单的旧“is NULL”操作似乎失败了。

mysql中的位类型有太多的错误。最好使用Tinyint(1)。对于所有使用布尔值的东西,最好是tinyint(1)(或enum('Y','N')

试试看,告诉我们