我在InnoDB 5.6和UDF函数中有相当大的MySQL表(~100 k行):
CREATE AGGREGATE FUNCTION collect RETURNS STRING SONAME 'libcollect.so';当我问起
SELECT collect('CASES:10,DROP:10', shipment_bucket_code, weight) FROM d_shipments;"83.140000,2513.910000,4439.710000,1764.100000,7852.960000,98.920000,828.620000,2346.950000,1566.620000,107594.130000"将是结果,这是正确的。
但是如果我在子查询中调用了UDF
SELECT * FROM (
SELECT collect('CASES:10,DROP:10', shipment_bucket_code, weight) FROM d_shipments
) as sub;结果将是"83.140000,2513.910000,4439.710000,1764.100000"。字符串被顶级查询切断。UDF调试证实了这一点。
另外,如果我在小型表上使用这些查询,一切都会正常工作。在使用内置函数(如CONCAT("83.140000,2513.910000,4439.710000,1764.100000,7852.960000,98.9", "20000,828.620000,2346.950000,1566.620000,107594.130000") )时也是如此。
在理性搜索过程中,我遇到了一个类似的老非固定错误。是否有什么解决办法?看来MySQL的子查询字符串结果受到某些缓冲区大小的限制,因为字符串切割的发生总是一样的。
UPD:目前找到的解决方法是将子查询重写为联接。
UPD2:...but并不适用于所有查询。很可能,bug是在相当大的桌子上复制的。
发布于 2014-07-03 08:39:44
因此,我找到了解决办法:显式返回值类型转换。
SELECT * FROM (
SELECT
CAST(collect('CASES:10,DROP:10', shipment_bucket_code, weight) AS CHAR(255))
FROM d_shipments
) as sub;可能,它允许为返回的字符串分配所需的内存大小。我没有查看mysql源代码,但是有一些东西提示我,UDF返回的字符串(和小数)的弱类型存在问题。
https://stackoverflow.com/questions/24493515
复制相似问题