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,提问作者형한결
相关产品推荐
相关产品推荐

