如何理解mysql函数中截断的不正确的双值错误的原因?

4bbkushb  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(289)

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

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

此表表示我要抽象的对象之间的树(多级,n元)关系。应用程序的其余部分已经使用了这个层次结构,很容易获得子级的父级或父级的子级。不过,我现在正试图解决一个问题,在这个问题中,我需要一个节点下的子树中的所有元素。在寻找答案的过程中,我在dba堆栈交换上发现了一个惊人的解决方案,它创建了一个正好满足这个需求的函数。以下是经过必要修改后的代码:

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。截断了不正确的双精度值“14,15,16”*
我一部分一部分地重写了函数,各个部分(查询等)都很好地工作。但在函数中,它抛出错误。
有什么问题吗?我怎样才能准确地找到导致错误的原因?

eni9jsuy

eni9jsuy1#

你的问题是:

SET front_id = FORMAT(queue,0);
``` `queue` 是一个逗号分隔的值列表,mysql不想将其转换为数值。将此行更改为

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

解决问题。在rextester上可以看到这个演示,您可以尝试在两行代码之间进行更改。

相关问题