解决python通过GROUP_CONCAT读取MySQL被截断的问题
前言
项目中经常要读取MySQL数据库,python中的pymysql函数可进行相关读取操作,但其中依然会遇到各种各样的问题,因此且做总结。
MySQL中的GROUP_CONCAT函数
由于要对大数据量对表进行去重和再统计,因此会用到GROUP_CONCAT
函数。其操作可概括如下:
CONCAT()
函数用于将多个字符串连接成一个字符串。
GROUP_CONCAT()
函数返回一个字符串结果,该结果由分组中的值连接组合而成。
这样,就可以通过GROUP_CONCAT(DISTINCT *)
函数在对数据去重的同时得到不重复字段对应的索引集合的结果,便于统计。
解决读取截断的问题
问题描述
采用GROUP_CONCAT
函数拼接字段数据时,总会遇到被截断的问题,比如这样的一连串警告:
Warning: (1260, 'Row 148 was cut by GROUP_CONCAT()')
在网上查了不少说法,最准确的就是MySQL中GROUP_CONCAT
默认长度为 1024,因此一行长度超过 1024 就会被截断。
但是同样的,很多解法都是在MySQL数据库中更改设置,但对于一般项目而言,数据库不是自建的情况下默认设置是没办法更改的,而且如果在数据库设置中更改默认长度,相应会增大所需的服务器存储空间,这也是不被允许的。那该怎么办呢?
解决方法
通过SET
语句临时更改GROUP_CONCAT
的默认长度:
cursor = conn.cursor()
cursor.execute('SET group_concat_max_len = 4294967295;')
如上所示,通过游标设置临时更改长度,游标使用结束后GROUP_CONCAT
的默认长度会恢复 1024,不影响原始数据库的设置。
注意:
- 在使用
SET
语句时不要用SET GLOBAL
,因为可能会遇到警告,提示你没有权限做全局更改的操作。group_concat_max_len
的长度可根据需要设置,这里的 4294967295 = 2^32-1。