MySQLのGROUP_CONCATには文字数制限がある
つい先日とあるプログラムで、MySQLから取得した値が途中で切れている事によるエラーが発生している事象がありました。
その値はGROUP_CONCATを使用していたので調べてみると、GROUP_CONCATには最大文字数の設定があることが判明しました。
MySQLのバージョン5.5で発生しましたが、それ以外のバージョンでも設定値はあるようです。
group_concat_max_len
MySQLのリファレンスを見てみると、GROUP_CONCAT関数の最大値はgroup_concat_max_len変数で決められていて、初期値は1024文字だそうです。
※リンクはバージョン5.6のものですが、5.5でも同じでした
今までGROUP_CONCATを使っていてそこまで長い結果を得る機会がなかったので知りませんでした、実際今回のケースはエラーの発生したプログラムでも初めての現象でした。
現在の設定値を知る場合は以下クエリで確認できます。
SHOW VARIABLES LIKE 'group_concat_max_len';
一時的な対応
とりあえずの対応で良ければ、同じセッション内での対応なら
SET group_concat_max_len = 1000000;
で大丈夫です、この場合は100万文字を最大値としています。
他のセッションでも有効にし、MySQLの再起動まで設定を保つのなら、SET GLOBALで対処。
SET GLOBAL group_concat_max_len = 1000000;
MySQLの再起動をしたくない場合にも上記クエリで一旦対応し、設定ファイルに後で書き込んでもいいと思います、よくやります。
恒久的な対応
設定をずっと保持したい場合にはmy.cnfに書き込みます。
[mysqld]
group_concat_max_len = 1000000
後は任意のタイミングでMySQLを再起動しておきます、今回のエラー対応は一旦SET GLOBALで反映しmy.cnfに同じ設定を書き込んでおきました。
そもそもの話なんですが、GROUP_CONCATで長すぎる値を取るのは設計として合っているのか微妙なところですね、見直してみようと思いました。