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,完美搞定!
但是有時候我們在生產環境中最好是使用前面兩種,儘量避免線上重啟資料庫服務解決。