在 MySQL 中,GROUP_CONCAT(expr) 函数会从 expr 中连接所有非 NULL 的字符串。如果没有非 NULL 的字符串,那么它就会返回 NULL。语法如下:
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
注意:GROUP_CONCAT 函数默认支持拼接的最大长度为 1024Byte 或 1KB。当拼接的长度超过 1024Byte 时,会自动截取掉后面的数据。我们使用 GROUP_CONCAT 时需要特别注意,如果拼接字符串长度超过 1024Byte,字符串被截断,可能会产生程序异常。
我们使用 GROUP_CONCAT 函数去将一张表符合条件的ID拼接成 “1,2,34,5” 这种格式,作为另一个 SQL 语句的 IN 子句的条件。此时,如果字符串被截断为 “1,2,34,”,那么 SQL 语句直接抛错,语法错误。如果字符串被截断为 “1,2,3”,那么 SQL 语句不会出现语法错误,但是程序会出现逻辑错误,这比语法错误更难排查。因此,下面将接收怎样去调整 GROUP_CONCAT 函数的默认最大拼接长度。
MySQL 中,支持两种方式去调整 GROUP_CONCAT 函数拼接的最大长度。分别如下:
这种方式修改后,仅仅修改内存中的配置,MySQL 服务重启将会失效。将下面命令在 MySQL 控制台执行,如下:
# 1.将 group_concat 最大拼接长度修改为 102400Byte SET GLOBAL group_concat_max_len = 102400; # 2.查看 group_concat_max_len 是否被修改成功 show variables like 'group_concat_max_len';
修改配置文件方式是长久修改,即使重启 MySQL 服务也生效。具体操作如下:
(1)进入 MySQL 的安装目录,找到 my.ini 配置文件,在配置文件最后添加 “group_concat_max_len = 102400” 配置,如下:
# Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES character_set_server=utf8 lower_case_table_names=1 group_concat_max_len = 102400
(2)重启 MySQL 服务。
(3)使用下面命令验证 group_concat_max_len 的值,如下:
show variables like 'group_concat_max_len';