首页 > 解决方案 > FIND_IN_SET 和截断不正确的 DOUBLE 值错误

问题描述

这是我的查询的一部分:

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'

标签: mysqlsqlstored-procedures

解决方案


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

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通常,子句 ( caseor )中的条件逻辑if()只会使表达式复杂化。

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

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

推荐阅读