【问题标题】:Exclude records with empty binary column data排除具有空二进制列数据的记录
【发布时间】:2016-03-08 20:13:51
【问题描述】:

我在 mysql 表中有一个类型为 binary(16) not null 的列。并非所有记录在此列中都有数据,而是因为它设置为不允许 NULL 此类记录具有全零值。

我想从查询中排除这些全零记录。

到目前为止,我能找到的唯一解决方案是HEX 的值并进行比较:

SELECT uuid
FROM example
WHERE HEX(uuid) != '00000000000000000000000000000000'

哪个有效,但有更好的方法吗?

【问题讨论】:

  • 你试过select uuid from example where uuid is not null吗?
  • 这些列从未设置为允许 NULL。
  • 当您查看数据库时,您看到这些记录的列中是空白还是空?
  • @RahulSharma 根据文档binary 列总是用\0 填充。因此插入一个空字符串'' 会得到N 次\0。我认为这就是问题所在。不过很好的谜语。让我们等戈登... ;-)

标签: mysql comparison binary-data


【解决方案1】:

要使用文字匹配binary 类型,请使用\0\1 作为位。

在您使用binary(16) 的情况下,这是仅排除零的方法:

where uuid != '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'

SQLFiddle

使用普通比较与文字(像这样)的优点是可以使用列上的索引,而且速度要快得多。如果您调用函数进行比较,则将使用索引,并且必须在每一行上调用函数,这可能会导致大型表出现很大的性能问题。

【讨论】:

  • 这个更漂亮。 (耳语,很抱歉在我上面的评论中提到了 Gordon ;-))
  • 我只是好奇:where uuid!=cast('' as binary(16)); 不会使用索引吗?我的意思是,它毕竟是一个常数。
【解决方案2】:
SELECT uuid FROM example WHERE TRIM('\0' FROM uuid)!='';

请注意,波西米亚人的回答要简洁得多,我只是在不确定字段长度时使用它(这可能在某种程度上归结为糟糕的设计,请随时教育我)。

【讨论】:

    【解决方案3】:
    select uuid from example where uuid!=cast('' as binary(N));
    

    其中 N 是 UUID 列的长度。不漂亮,但工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多