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



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

我添加了一个新的专栏:

ALTER TABLE product ADD hide BINARY NULL;

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

*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.7(

问题2:如何暂时隐藏产品?以不同的方式?

由于产品可以隐藏也可以不隐藏,我建议更改字段的定义,并对其强制使用NOT NULL约束。

如前所述:

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

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

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

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

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

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

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

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

相关内容

  • 没有找到相关文章