mysql - 如何理解导致 MySQL Function 中 Truncated incorrect double value 错误的原因?

标签 mysql sql database stored-procedures stored-functions

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

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

这张表代表了我要抽象的对象之间的树状(多级,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。截断了不正确的 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您可以在其中尝试在两行代码之间进行更改。

关于mysql - 如何理解导致 MySQL Function 中 Truncated incorrect double value 错误的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52720302/

相关文章:

mysql - SQL查询最大最小值

mysql - Django 查询集 : Why can't I filter an annotated QuerySet?

mysql - 如何找出 MySQL 中的默认字符集/排序规则

php - 为 @ID 字段插入 null 的 Doctrine

javascript - modal中从MySQL获取用户信息

sql - 根据其他列日期选择列值

php - 将数组插入mysql数据库

sql - INSERT INTO 语句中的大小写

mysql - 在 DBMS 上存储高度 secret 数据的安全指南

Propel 中的数据库分片支持