为什么此递归concat产生:数据太长

时间:2019-02-17 11:02:32

标签: mysql concat varchar recursive-query

我在MySQL 8上有此表:

create table tbl(id varchar(2), val int);
insert into tbl values ('A',  1), ('B',  2), ('C',  3), ('D',  4), ('E',  5);

以下查询应找出哪些记录集的值加起来不超过6(不考虑顺序的重要性):

with recursive cte(greatest_id, ids, total) as (
    select     id,
               concat(id, ''), 
               val
    from       tbl
    union all
    select     tbl.id,
               concat(cte.ids, tbl.id),
               cte.total + tbl.val
    from       cte 
    inner join tbl 
            on tbl.id > cte.greatest_id
           and cte.total + tbl.val <= 6
) 
select ids, total from cte

Running it导致以下错误:

  

错误:ER_DATA_TOO_LONG:第7行第concat(id, '')列的数据太长

MySQL为什么会产生此错误?

有关信息,所需的输出如下:

 IDS | TOTAL
 ----+------
 A   |  1
 B   |  2
 C   |  3
 D   |  4
 E   |  5
 AB  |  3
 AC  |  4
 AD  |  5
 AE  |  6
 BC  |  5
 BD  |  6
 ABC |  6

我想知道MySQL在哪条(已记录?)规则中产生此错误。

通过比较,该查询在PostgreSQL和Oracle上运行良好(使用它们的语法变体),所以我并不真正理解为什么 MySQL出现问题。

1 个答案:

答案 0 :(得分:2)

一个很长的MySQL 8 CTE manual page示例说明了您遇到的问题。基本上,问题在于您的ids列太窄,无法为其分配ABC值,因为它是从CTE的非递归部分获得宽度的(实际上是{{ 1}},即2个字符)。您可以使用id来解决该问题,使其宽度足够大以适合所有结果,例如:

CAST

Update of your demo