GROUP_CONCATのgroup_concat_max_len()が有効にならない対処法
MySQLでGROUP_CONCATを使ったカラムの連結処理はとても便利ですが、
ローカルでは動いているのに、レンタルサーバで実行すると、
途中で切れてしまう事もあるのではないでしょうか。
そんな時には「group_concat_max_len」でより大きな値を設定して変更する事ができます。
GROUP_CONCATのgroup_concat_max_len()が有効にならない対処法
とてもありがたい「group_concat_max_len」による一時的な設定変更ですが、
レンタルサーバーでは有効にならない場合があります。
「group_concat_max_len」の設定方法としては以下のような記述です。
1 |
set global group_concat_max_len = 200000; |
このようなSQLを私はPHP側から実行してローカルでテストしていました。
どうせ、サーバー上は直接こういう設定変更はできないだろうし、
常に拡張しておきたいわけでもないからと、
その都度、必要なプログラムのみ、指定するという使い方です。
しかし、このままではそもそもレンタルサーバーでは実行しても有効にはなりませんでした。
PHPでやっている時には、
サーバーからのメッセージを受け取っていなかったので気づかなかったのですが。。。
phpMyAdminで実行してみると分かります。
1 |
set global group_concat_max_len = 200000; |
実行後に表示されるメッセージです。
1 2 3 |
SET GLOBAL group_concat_max_len = 200000 #1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation |
「Access denied;」ですので権限がない・・・と。
ローカルはroot権限ですから、気づくわけもない訳です。
ちなみに私はXSERVER環境でこの壁に当たりましたが、
他のレンタルサーバーでも、あまり大きな値は設定していないと思います。
現在の「group_concat_max_len」サイズを確認するには、
以下のSQLを実行します。
1 |
show variables like 'group_concat_max_len'; |
返答は以下のようになります。
Variable_name | Value |
---|---|
group_concat_max_len | 1024 |
lenですので、1024文字(1024 byte)が設定されていました。
諦めそうになった時ですが、何でダメなんだろうと考え気づいたのがココです。
SET GLOBAL group_concat_max_len = 200000
グローバル変数に対しての設定変更ですので、
MySQLサーバー全体に有効になる設定を変更しようとしているのです。
サーバー内に同居している他のユーザーさんに対しても、
この設定が有効になってしまうという事は変更できなくて当然です。
そこで、以下のように変更します。
set Session group_concat_max_len = 200000;
これでちゃんと設定がこのセッションに限って有効になります。
実際にphpMyAdminから実行して試します。
1 2 |
set Session group_concat_max_len = 200000; show variables like 'group_concat_max_len'; |
返答は以下のようになります。
Variable_name | Value |
---|---|
group_concat_max_len | 200000 |
対処法は。
これだけです。
GLOBAL ではなく SESSION に対して変更する。
13.7.4 SET 構文
123456 SET variable_assignment [, variable_assignment] ...variable_assignment:user_var_name = expr| [GLOBAL | SESSION] system_var_name = expr| [@@global. | @@session. | @@]system_var_name = expr
何をしようと思ったのか?
皆さん、GROUP_CONCATが使いたいシーンは、
やっぱり結構無理がかかっている処理をしたいときだろうなと思うのです。
DISTINCTも使えばデータはユニークになりますしとても便利です。
私の場合、別件で利用していたテーブルデータを、
集計した結果を保持している側に、
元の集計元のデータが追えるようにGROUP_CONCATで、
データを連結して保持していました。
こんな感じでバー分割のCSV形式でした。
arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin
事情があって、このようなデータを持っているレコード同士をまとめて、
最終的にはユニーク化して表示したい。
ある長い部分をつなげてみると、このくらいのデータになっています。
lacnic|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|ripencc|ripencc|ripencc|apnic|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin|arin
もう何がなんだか・・・って感じですよね。
でも値が取れてしまえば、配列に分割(explode)して、
重複削除(array_unique)をしてしまえば、すっきりと関係した情報のリストが取れると。
無茶な方法を取っているのですが、表示したいだけなのでむしろ助かるのがこういう乱暴なアプローチ。
実際には、以下のようなリストを作っています。
以下のリンク先の表で「RIR」列に表示している値がそれです。
IPアドレスの「11.0.0.0/8 (011/8)」などの範囲に対して、
グローバルIPアドレスを各国に割当てているRIRはどこが含まれているのか?です。
(たぶん大半の人にはどうでもいい事でしょう)
そんなこんなで、GROUP_CONCATの値を拡張するには、
共用サーバーでは、Session で設定しよう。
参考
ありがとう。
(参考)MySQLのgroup_concatの結果が短い気がするのは環境変数で制限されているから。 | 三度の飯とエレクトロン
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人が著作権を保持しております。
当サイトでご紹介しております写真につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
関連記事
-
phpMyAdminを利用したMySQL同期とWM3500Rポート解放
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
ローカル環境へのMySQL設置
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
phpMyAdminを利用したMySQLデータのエクスポート
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(構造編)phpMyAdminを利用したエクスポートオプションと出力の関係
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
phpMyAdminを利用したMySQLデータのエクスポート形式一覧とデータ
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
phpMyAdminを利用したMySQLデータのAuto Increments Option動作比較
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
KAGOYA™(カゴヤ)のMySQL単独プランの利用手順
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
phpMyAdminを利用したMySQLデータのインポート形式一覧とデータ
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(データ編)phpMyAdminを利用したエクスポートオプションと出力の関係
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
phpMyAdminでMySQLデータをサーバー上にエクスポートする
Google or AdMax Promotion(it) 禁断の機能がau公式 …
Comment
ええかげんブログ(本店) 運営者様
突然のご連絡、恐れ入ります。Eleven Tenthsの須々木と申します。
弊社は複数の専門部門を持つ、英国のデジタルエージェンシーです。
サイトを拝見させて頂き、商品無料提供にてレビュー記事にご協力を頂けないかと考えご連絡致しました。
広告はオンラインリンクを添付することで「購買」を促すものではなく、サイトのPV数向上、SEO上の効果向上のための施策となります。
下記の形で協業を行っております。
(1)弊社ライターによる記事執筆・寄稿
(2)貴社に記事執筆も含めてご依頼させていただく (関連する製品のレビュー記事、タイアップ記事をご執筆をお願いすることも可能)
(3)被リンク掲載
是非ご検討頂けますと幸いです。何卒宜しくお願い申し上げます。
Eleven Tenths 須々木