如何理解 MySQL 函数中导致 Truncated incorrect double value 错误的原因?

How to understand what causes Truncated incorrect double value error in MySQL Function?

我有一个 table,其中包含以下形式的父子关系:

+----+-----------+
| id | nParent   |
+----+-----------+
|  1 |         0 |
|  2 |         1 |
|  3 |         2 |
|  4 |         3 |
|  5 |         3 |
|  6 |         4 |
+----+-----------+

这个table代表了我要抽象的对象之间的树状(多级,n元)关系。应用程序的其余部分已经使用了这个层次结构,并且很容易获得一个或多个父项的子项的父项。但是,我现在正在尝试解决一个问题,我需要一个节点下的子树中的所有元素。在搜索答案时,我找到了一个 amazing solution on DBA Stack Exchange 来创建一个完全满足此要求的函数。这是经过必要修改后的代码:

CREATE FUNCTION `GetFamilyTree`(GivenID INT) RETURNS varchar(1024) CHARSET latin1
DETERMINISTIC
BEGIN

DECLARE rv,q,queue,queue_children VARCHAR(1024);
DECLARE queue_length,front_id,pos INT;

SET rv = '';
SET queue = GivenID;
SET queue_length = 1;

WHILE queue_length > 0 DO
    SET front_id = FORMAT(queue,0);
    IF queue_length = 1 THEN
        SET queue = '';
    ELSE
        SET pos = LOCATE(',',queue) +1 ;
        SET q = SUBSTR(queue,pos);
        SET queue = q;
    END IF;
    SET queue_length = queue_length - 1;

    SELECT IFNULL(qc,'') INTO queue_children
    FROM (SELECT GROUP_CONCAT(id) qc
    FROM nodes WHERE nParent = front_id) A;

    IF LENGTH(queue_children) = 0 THEN
        IF LENGTH(queue) = 0 THEN
            SET queue_length = 0;
        END IF;
    ELSE
        IF LENGTH(rv) = 0 THEN
            SET rv = queue_children;
        ELSE
            SET rv = CONCAT(rv,',',queue_children);
        END IF;
        IF LENGTH(queue) = 0 THEN
            SET queue = queue_children;
        ELSE
            SET queue = CONCAT(queue,',',queue_children);
        END IF;
        SET queue_length = LENGTH(queue) - LENGTH(REPLACE(queue,',','')) + 1;
    END IF;
END WHILE;

RETURN rv;

END

但是当我 运行 它时,我收到一条错误消息 错误代码:1292。T运行计算出不正确的 DOUBLE 值“14,15,16”*

我逐部分重写了函数,各个部分(查询等)运行良好。但是在函数中,它会抛出错误。

可能出了什么问题? 我怎样才能准确找到导致错误的原因?

您的问题出在这一行:

SET front_id = FORMAT(queue,0);

queue 是逗号分隔的值列表,MySQL 不想将其转换为数值。将此行更改为

SET front_id = cast(substring_index(queue, ',', 1) as unsigned);

解决问题。请参阅此 demo on rextester,您可以在其中尝试在两行代码之间进行更改。