MySQL truncates concatenated result of a GROUP_CONCAT function
As Jocelyn mentioned, the size of a GROUP_CONCAT()
result is bounded by group_concat_max_len
, however there is an additional interaction with ORDER BY
that results in a further truncation to 1/3 of group_concat_max_len
. For an example, see this related answer.
The default value for group_concat_max_len
is 1024, and 1024 / 3 = 341 probably explains why the type of concat_products shows up as varchar(341)
in the original example. If you were to remove the GROUP BY productId
clause, concat_products should show up as varchar(1024)
.
I have not found this interaction between GROUP_CONCAT()
and ORDER BY
mentioned in the MySQL Manual, but it affects at least MySQL Server 5.1.
As I already wrote in an earlier comment, the MySQL manual says:
Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535.
So the problem is not with the data type of the field.
The MySQL manual also says:
The result is truncated to the maximum length that is given by the group_concat_max_len system variable, which has a default value of 1024. The value can be set higher, although the effective maximum length of the return value is constrained by the value of max_allowed_packet. The syntax to change the value of group_concat_max_len at runtime is as follows, where val is an unsigned integer: SET [GLOBAL | SESSION] group_concat_max_len = val;
Your options for changing the value of group_concat_max_len are:
- changing the value at MySQL startup by appending this to the command:
--group_concat_max_len=your_value_here
- adding this line in your MySQL configuration file (mysql.ini):
group_concat_max_len=your_value_here
- running this command after MySQL startup:
SET GLOBAL group_concat_max_len=your_value_here;
- running this command after opening a MySQL connection:
SET SESSION group_concat_max_len=your_value_here;
Documentation: SET, Server System Variables: group_concat_max_len