• MySQL中使用group_concat()函数数据字符过长报错的问题解决方法


    最近在办公软件项目,在开发权限指标遇到一个问题:
    我们系统的一些逻辑处理是用存储过程实现的,但是有一天客户反馈说权限指标分配报错,查了分配的权限数据牵扯到的数据权限基础资源,没有问题。
    权限指标分配的存储过程中有这样两句代码:

    SET @tests = '';
    SELECT
    GROUP_CONCAT( DISTINCT REPLACE ( concat( '''', ( indicator_content ), '''' ), ',', ''',''' ))
    AS Allnumber INTO @tests

    执行存储过程后 变量@tests会返回一段数据,只能调试存储过程找问题了。调试到下面这段的时候,发现执行完这句sql,@tests就变成不完整的一个语句
    1 select GROUP_CONCAT( DISTINCT REPLACE ( concat( '''', ( indicator_content ), '''' ), ',', ''',''' )) into @tests from USEROFINDICATOR ;
    由于USEROFINDICATOR表存储的权限指标都是按指标编号存储的数据比较多,所以猜测是不是group_concat的问题,所以我把USEROFINDICATOR表中的数据减少了一半,就是是按某一个用户查询,发现成功了,所以猜测group_concat是不是有长度限制,google一下,果然是这个函数长度不够造成。
    关于group_concat函数:
    group_concat数据量小的时候没什么问题,但是数据量大的时候就有问题了;
    group_concat:默认可连接的长度是1024;如果已经设置了最大长度,超过这个长度就会被截取至这个长度;
    在查询(select)语句中,使用了group_concat之后,limit就会失效;
    解决方法:
    1、修改MySQL的配置文件:
    #需要设置的长度
    group_concat_max_len = 5120

    2、也可以使用sql语句设置:
    SET GLOBAL group_concat_max_len=5120;
    SET SESSION group_concat_max_len=5120;
    但是以上两种方法貌似我都出现了问题,第二种方法开始生效,长度也查了都没问题,但是就是执行语句有问题;

    最后我采用第三种方法如下:

    3、修改mysql配置文件的方法,修改完后重启MySQL服务,则可以通过语句设置group_concat的作用范围,如:

     SET GLOBAL group_concat_max_len=-1;

     SET SESSION group_concat_max_len=-1;

    以上设置Mysql最大长度设置,

    mysql> show variables like "%concat%"; 命令查了一下,数据量挺长的。

    注意LINUX 设置需要在/etc/my.cnf  且需要设置位置在 需要有管理员权限才可以操作GLOBAL;

    我在存储过程中采用了上面的第三种办法,执行存储过程,OK,完美搞定!

    但是有时候我们在生产环境中最好是使用前面两种,尽量避免线上重启数据库服务解决。

  • 相关阅读:
    聊聊WS-Federation
    用双十一的故事串起碎片的网络协议(上)
    责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析
    最小化局部边际的合并聚类算法(中篇)
    最小化局部边际的合并聚类算法(上篇)
    UVaLive 7371 Triangle (水题,判矩形)
    UVaLive 7372 Excellence (水题,贪心)
    POJ 3312 Mahershalalhashbaz, Nebuchadnezzar, and Billy Bob Benjamin Go to the Regionals (水题,贪心)
    UVa 1252 Twenty Questions (状压DP+记忆化搜索)
    UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)
  • 原文地址:https://www.cnblogs.com/angelasp/p/groupconcat.html
Copyright © 2020-2023  润新知