【问题标题】:TINYINT column & usage in Where clause - unexpected behaviourWhere 子句中的 TINYINT 列和用法 - 意外行为
【发布时间】:2019-05-14 10:25:40
【问题描述】:

我想要控制在网站上同时隐藏一些产品。我认为在数据库上进行更改比更改 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.17)

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

【问题讨论】:

    标签: mysql null binary where-clause tinyint


    【解决方案1】:

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

    here所述:

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

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

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

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

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

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

    【讨论】:

    • 我没有在数据插入 sql 中使用该列。如果我定义为 NOT NULL,我应该为所有带有 0 的产品包含该列,但我可以将默认值设置为 0 并再次省略。也许吧。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2017-03-17
      相关资源
      最近更新 更多