首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL从使用UDF的子查询中切断字符串。

MySQL从使用UDF的子查询中切断字符串。
EN

Stack Overflow用户
提问于 2014-06-30 15:19:25
回答 1查看 418关注 0票数 0

我在InnoDB 5.6和UDF函数中有相当大的MySQL表(~100 k行):

代码语言:javascript
复制
CREATE AGGREGATE FUNCTION collect RETURNS STRING SONAME 'libcollect.so';

当我问起

代码语言:javascript
复制
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

代码语言:javascript
复制
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是在相当大的桌子上复制的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-03 08:39:44

因此,我找到了解决办法:显式返回值类型转换。

代码语言:javascript
复制
SELECT * FROM (
    SELECT 
        CAST(collect('CASES:10,DROP:10', shipment_bucket_code, weight) AS CHAR(255))
    FROM d_shipments
) as sub;

可能,它允许为返回的字符串分配所需的内存大小。我没有查看mysql源代码,但是有一些东西提示我,UDF返回的字符串(和小数)的弱类型存在问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24493515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档