You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HackerRank绘制三角形2递归CTE报错排查:数据过长问题

HackerRank Draw Triangle 2 问题排查与解决

一、为什么Draw Triangle 1未触发1406错误?

Draw Triangle 1是倒三角输出(从20个*递减到1个),你用LEFT()实现时,初始行生成的是20个*的字符串,此时递归CTE的列长度被默认设置为20。后续递归中每次取LEFT(str, LENGTH(str)-1),生成的字符串长度只会越来越短,始终不超过20,完全符合列的长度限制,因此不会触发数据过长错误。

二、Draw Triangle 2两种方法的问题分析与修复

1. LEFT()函数触发ERROR 1406的原因与修复

你遇到的1406错误,核心原因是递归CTE的列长度由初始行决定:如果Draw Triangle 2的初始行只生成1个*,那么列长度会被固定为1,后续递归生成更长的字符串时,就会超过列的最大长度限制,触发数据过长报错。

修复方案:确保初始行生成足够长的字符串(20个*),同时配合递增的数字来截取对应长度的内容:

WITH RECURSIVE cte AS (
    SELECT 1 AS n, REPEAT('*', 20) AS full_stars
    UNION ALL
    SELECT n + 1, full_stars FROM cte WHERE n < 20
)
SELECT LEFT(full_stars, n) AS stars FROM cte;

这里初始行的full_stars列长度是20,后续递归截取1到20个字符,完全在列长度范围内,不会触发错误。

2. CONCAT拼接无结果的问题排查

本地执行无报错但看不到结果,大概率是递归逻辑或执行步骤的问题:

  • 检查是否遗漏了最终的SELECT语句:仅定义CTE不会输出结果,必须执行SELECT * FROM cte(或指定列)才能查看;
  • 检查递归终止条件:如果终止条件错误(比如写成LENGTH(stars) <=20),会导致生成21行数据,但不会导致无结果;
  • 确认递归逻辑正确:正确的CONCAT拼接正三角的写法如下:
WITH RECURSIVE cte AS (
    SELECT '*' AS stars
    UNION ALL
    SELECT CONCAT(stars, '*') FROM cte WHERE LENGTH(stars) < 20
)
SELECT stars FROM cte;

执行上述语句后,本地MySQL应该会输出1到20个*的正三角结果。如果仍看不到,检查客户端是否隐藏了结果集,或重启客户端重试。

内容的提问来源于stack exchange,提问作者형한결

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:39:24