动态地将内存分配给列的MySQL查询

时间:2017-11-04 00:38:54

标签: php mysql

我有这个问题:

SELECT DISTINCT(po.mark) franquicia, COUNT(po.id) failures, GROUP_CONCAT(po.log_transaction SEPARATOR ';') logs, DATE(po.created) fecha
FROM pagos_onlines AS po
INNER JOIN usuarios_tokens AS ut ON po.usuario_token = ut.id
WHERE status = 'REJECTED'
AND created > '2017-10-03 11:00:01'
GROUP BY fecha, franquicia;

问题是log_transaction是表中的BLOB类型,它存储JSON数据,因此字段"记录"应该是一个带有连接JSON的巨大字符串。当我运行此查询时,字段中只出现了一个半JSON" logs",所以我的猜测是该字段的内存空间不足。

在运行MySQL SELECT查询时,有没有办法为特定列动态分配内存?

2 个答案:

答案 0 :(得分:1)

此查询几乎肯定会对GROUP_CONCAT删除的数据发出警告。如果您使用忽略警告的客户端或库,则可以在运行查询后立即运行查询SHOW WARNINGS;,并确认此警告存在。

要解决此问题,您需要增加系统变量@@GROUP_CONCAT_MAX_LEN的值,以便在不截断的情况下获得更长的结果。

默认值仅为1024(字节,而不是字符,根据文档)。您可以在全局配置中更改此设置,也可以在运行此查询之前在会话中更改它。

答案 1 :(得分:0)

  

BLOB或TEXT对象的最大大小由其类型决定,   但实际上你可以在客户和客户之间传输的最大值   服务器由可用内存量和大小决定   通讯缓冲区。您可以通过更改消息缓冲区大小   更改max_allowed_packet变量的值,但您必须这样做   所以对于服务器和客户端程序都是如此。

您更改选项 max_allowed_pa​​cket 的值。

官方参考文件:https://dev.mysql.com/doc/refman/5.7/en/blob.html