tinyint列和where子句中的用法-意外行为

njthzxwz  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(375)

我想有一个控制隐藏在网站上的一些产品同期。我认为对数据库进行更改比更改sql和再次加载页面更容易。
我添加了一个新列:

ALTER TABLE product ADD hide BINARY NULL;

它创建了一个tinyint(1)列。如果我将一些产品设为1以隐藏,然后再将其中一些设为0以显示,我将有一个带有隐藏列的表,如下所示:


* hide*

NULL
0
1

当我通过以下方式查询时:

SELECT * FROM product WHERE hide <> 1;

它只显示0,但不显示null。当我将列改为位时,它变成了位(1),相同的查询结果是相同的。
从逻辑上讲,如果某个对象被定义为0或1,则没有其他选项。所以你用二进制。第三种选择不合逻辑。
为了符合这些定义,只有这样才能写出下面的内容吗?

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

(使用MySQL5.6.17)
问题2:如何暂时隐藏产品?以另一种方式?

xtupzzrd

xtupzzrd1#

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

xa9qqrwz

xa9qqrwz2#

由于产品可以隐藏或不隐藏,我建议更改字段的定义并强制 NOT NULL 这方面的限制。
如本文所述:
首先,使所有当前空值消失:

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

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

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

如果出于某种原因,您确实希望保留空值,那么必须将查询更改为您提供的第二个版本。
也就是说,我不会用数据库的方法来“临时”隐藏。对于这种情况,我认为最好将产品隐藏在应用程序级别。

相关问题