1. 程式人生 > 資料庫 >Mysql5.7中使用group concat函式資料被截斷的問題完美解決方法

Mysql5.7中使用group concat函式資料被截斷的問題完美解決方法

前天在生產環境中遇到一個問題:使用 GROUP_CONCAT 函式select出來的資料被截斷了,最長長度不超過1024位元組,開始還以為是navicat客戶端自身對欄位長度做了限制的問題。後面故意重新INSERT了一個欄位長度超1024位元組的資料,但是navicat能完整展示出來,所以就排除了navicat的問題。

然後想到1024這個熟悉的數字,會不會是C++框架在接收MySQL通過socket傳輸過來的資料時被處理了呢?於是手工在日誌中列印這個欄位,發現即使資料長度超過1024位元組仍然是可以完整顯示的。

1 查詢原因

至此,只能從SQL語句出發了。網上搜了下 GROUP_CONCAT 資料截斷的問題,答案都指向了 group_concat_max_len 這個引數,它的預設值正好是1024。可以直接在資料庫中通過下面的命令檢視這個預設值:

mysql> show variables like 'group_concat_max_len';
+----------------------+-------+
| Variable_name  | Value |
+----------------------+-------+
| group_concat_max_len | 1024 |
+----------------------+-------+
1 row in set (0.00 sec)
mysql>

MySQL官方手冊 對它的定義是 The maximum permitted result length in bytes for the GROUP_CONCAT() function

. ,也就是它限制了 GROUP_CONCAT 資料的長度。

2 解決問題

只要調整 group_concat_max_len 到最大值就行了,官方在MySQL5.7的手冊中給出瞭如下定義:

由於BZ的測試虛擬機器MySQL5.7.19是64位的,所以可以通過下面這兩種方法配置好 group_concat_max_len 為最大值``:

#### 方法一:修改MySQL配置檔案my.cnf,在[mysqld]節點中新增
group_concat_max_len = 18446744073709551615
#### 方法二:直接控制檯上設定立即生效
-- 【必須操作】更改全域性配置----
SET GLOBAL group_concat_max_len=18446744073709551615;
-- 【可選操作】使配置在當前會話中也立即生效,其它已經登入的會話終端需要重啟生效----
SET SESSION group_concat_max_len=18446744073709551615;

3 測試效果

這裡採用的是第二種方法,通過執行 SELECT LENGTH(GROUP_CONCAT(Fremark)) FROM account; 結果的對比,可以發現已經成功解決了MySQL5.7中使用GROUP_CONCAT資料被截斷的問題。

總結

以上所述是小編給大家介紹的Mysql5.7中使用group concat函式資料被截斷的問題完美解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!