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,完美搞定!

但是有時候我們在生產環境中最好是使用前面兩種,盡量避免線上重啟數據庫服務解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM