Where子句中的TINYINT列和用法-意外行为

时间:2018-12-13 08:35:51

标签: mysql null binary where-clause tinyint

我想要一个控件来同时隐藏一些产品在网站上。我认为在数据库上进行更改要比更改sql和再次加载页面容易。

我通过以下方式添加了新列:

ALTER TABLE product ADD hide BINARY NULL;

它创建了TINYINT(1)列。如果我要隐藏一些产品1,然后再将其中一些产品显示0,我将有一个带有hide列的表,如:

*hide*
NULL
0
1

我的查询依据:

SELECT * FROM product WHERE hide <> 1;

它仅显示0,而不显示NULL。 当我将列更改为BIT时,将其更改为BIT(1),相同的查询将得出相同的结果。

逻辑上,如果将某些内容定义为0或1,则没有其他选择。这就是为什么使用二进制文件的原因。第三种选择是不合逻辑的。

要遵守这些定义,写下面的唯一方法是吗?

SELECT * FROM product WHERE hide <> 1 OR hide IS NULL;

(使用MySQL 5.6.17)

问题2:如何暂时隐藏产品?用另一种方式?

2 个答案:

答案 0 :(得分:0)

由于产品可以是隐藏的也可以是不隐藏的,所以我建议更改字段的定义,并对其施加NOT NULL约束。

here所述:

  

首先,使所有当前的NULL值消失:

UPDATE `product` SET `hide`=0 WHERE `hide` IS NULL
     

然后,更新表定义以禁止使用NULL:

ALTER TABLE `product` ALTER COLUMN `hide` TINYINT NOT NULL

如果出于某种原因您确实想要保留NULL值,则必须将查询更改为提供的第二个版本。

也就是说,我不会在“临时”皮革上使用数据库方法。对于这种情况,我认为最好在应用程序级别隐藏产品。

答案 1 :(得分:0)

我认为mysql将首先搜索具有值的行,然后搜索值本身,这就是为什么不会显示空值的原因。

但是,如果该值为空白,则会显示该行。