【问题标题】:FIND_IN_SET and Truncated incorrect DOUBLE value errorFIND_IN_SET 和截断不正确的 DOUBLE 值错误
【发布时间】:2019-10-13 07:41:04
【问题描述】:

这是我的查询的一部分:

select * from tb_test where IF(_Tags,
             TAD.id IN (
                 SELECT T2.taggable_id as id FROM Tb_Taggables T2
                 WHERE T2.taggable_type = 'archives'
                 AND
                FIND_IN_SET(T2.tag_id,_Tags)
             )
        ,TRUE)

_Tags 的值如下:'377,379'

我的Tb_Taggables 表:

CREATE TABLE Tb_Taggables (
    id            bigint UNSIGNED AUTO_INCREMENT
        PRIMARY KEY,
    tag_id        bigint UNSIGNED NOT NULL,
    taggable_id   bigint UNSIGNED NOT NULL,
    taggable_type varchar(191)    NOT NULL,
    created_at    timestamp       NULL,
    updated_at    timestamp       NULL
)
    COLLATE = utf8mb4_unicode_ci;

但我收到此错误消息:

[22007][1292] (conn=29800) Truncated incorrect DOUBLE value: '377,379'

【问题讨论】:

  • 您在该查询中对_Tags 的任何使用都不应该产生该错误。 dbfiddle.uk/…
  • 样本数据在这里会很有帮助。请注意,FIND_IN_SET 出现在 MySQL 代码中通常是一种设计或代码气味。
  • _Tags 是一个字符串,对吧?为什么它是函数if()的第一个参数?
  • @S.M_Emamian 为什么不简单地写 IF (_Tags IS NOT NULL , ....) 原因您收到此截断的警告/错误,因为 IF(..) 语句期望第一个参数是导致布尔值的条件表达式。因为,_Tags 是文本,它会尝试将其隐式类型转换为布尔值,从而生成此警告
  • IF() 的第一个参数应该是一个布尔表达式:dev.mysql.com/doc/refman/8.0/en/…。您使用 _Tags 的方式使 if() 返回始终为 TRUE(除非 _Tags 以数字开头)。

标签: mysql sql stored-procedures


【解决方案1】:

为什么要使用条件表达式?

where (_Tags is null or
       TAD.id IN (SELECT T2.taggable_id as id
                  FROM Tb_Taggables T2
                  WHERE T2.taggable_type = 'archives' AND
                        FIND_IN_SET(T2.tag_id, _Tags)
                 )
      )

一般来说,where 子句(caseif())中的条件逻辑只会使表达式复杂化。

现在您已经解决了这个问题,您可以着手修复您的数据模型。您在列中存储多个值。以下是 一些 不好的原因:

  • 数字应该使用正确的类型来存储,而不是字符串。
  • 连接表的 ID 应正确声明外键关系,但您不能这样做。
  • 数据库通常具有较差的字符串处理功能。
  • 数据库具有用于存储列表的出色数据结构。它被称为 table 而不是 string
  • 在字符串中转储多个值会阻止在该列上使用索引和分区,这会影响可伸缩性和性能。

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2021-05-13
    相关资源
    最近更新 更多