• mysql 无限递归出现 data too long for column 'xxx' 错误


    1、先创建函数getChildId_bas_basic_tree  如下:

    CREATE  FUNCTION `getChildId_bas_basic_tree`(rootId int) RETURNS varchar(21844) CHARSET gbk
    BEGIN 
        DECLARE pTemp Varchar(21844);               
        DECLARE cTemp Varchar(21844);      -- 节点ID(临时变量)
    
        SET pTemp = '';  
        SET cTemp =cast(rootId as CHAR);  -- 把rootId强制转换为字符。
            
            WHILE cTemp is not null DO  
                SET pTemp = concat(pTemp,',',cTemp);  -- 把所有节点连接成字符串。
                SELECT group_concat(childid) INTO cTemp FROM ranks 
                WHERE FIND_IN_SET(parentid,cTemp)>0;
            END WHILE;  
            
        RETURN pTemp;  
    END

    2、调用函数:

        SELECT
                    childid,parentId
                FROM 
                    ranks T,
                    (SELECT @DATAS := getChildId_bas_basic_tree (1200)) a
                WHERE find_in_set (childid, @DATAS);

     ps:在调用  group_concat  函数时出现, “data too long for column 'xxx' ”

    解决方法步骤:

    第一步:设置 group_concat_max_len  值

    1.1)、查看

    show variables like “group_concat_max_len”

    1.2)、设置长度,GLOBAL是全局,SESSION指的是当前会话,重启会无效,所以要结合第三步

    SET GLOBAL group_concat_max_len=10240;
    SET SESSION group_concat_max_len=10240;

    1.3)、配置中设置 my.cnf :

    group_concat_max_len = 10240

    如果还是出现: “data too long for column 'xxx' ” 错误

    第二步:

    2.1)、查询mysql的字符集:

    show VARIABLES like 'character%';

    2.2)、修改character_set_database 的value,执行如下sql:

    alter database character set latin1;

     对于递归函数  getChildId_bas_basic_tree 设置为gbk,以为gbk查询速率比uft8快。

     

  • 相关阅读:
    驯服 Tiger: 并发集合 超越 Map、Collection、List 和 Set
    模块化Java:声明式模块化
    模块化Java:静态模块化
    用 Apache Tika 理解信息内容
    Refactoring: Encapsulate Collection
    新型的几乎万能的数据结构CDO
    CDO数据结构基础(1) 转载
    模块化Java简介(转载infoq)
    模块化Java:动态模块化
    责任链模式(C++)
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/14683078.html
Copyright © 2020-2023  润新知