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

MySQL自定义函数get_ascii_sum计算ASCII和结果错误求助

MySQL函数get_ascii_sum错误排查:输入'abc'仅返回97的原因及修复

问题复现

给定的MySQL函数用于计算输入单词的ASCII值总和,但输入'abc'时仅返回97(仅第一个字符'a'的ASCII值),代码如下:

DELIMITER //

CREATE FUNCTION get_ascii_sum (word VARCHAR ( 55 )) 
    RETURNS INT ( 11 ) 
    BEGIN
    DECLARE count_word INT DEFAULT LENGTH( word );
    DECLARE index_count INT DEFAULT 1;
    DECLARE alphabet_abc VARCHAR ( 55 ) DEFAULT '';
    DECLARE sum_ascii INT DEFAULT 0;
    REPEAT
        SET alphabet_abc = SUBSTRING( word FROM index_count FOR 1 );
        SET sum_ascii =sum_ascii + ASCII( alphabet_abc );
        SET index_count = index_count + 1;
    UNTIL index_count <= count_word 
    END REPEAT;
    RETURN sum_ascii;
END //

错误原因

问题出在REPEAT循环的终止条件上:

  • MySQL的REPEAT...UNTIL逻辑是:先执行一次循环体,再判断UNTIL后的条件,当条件为真时停止循环。
  • 输入'abc'时,count_word = LENGTH('abc') = 3,初始index_count = 1。
  • 第一次执行循环体:取第一个字符'a',sum_ascii变成97,index_count变为2。
  • 此时检查UNTIL index_count <= count_word,也就是2 <= 3,条件为真,循环直接终止,后续字符'b'和'c'根本没处理。

修复方案

把UNTIL的条件改成index_count > count_word,这样当索引超过字符串长度时才停止循环:

DELIMITER //

CREATE FUNCTION get_ascii_sum (word VARCHAR ( 55 )) 
    RETURNS INT ( 11 ) 
    BEGIN
    DECLARE count_word INT DEFAULT LENGTH( word );
    DECLARE index_count INT DEFAULT 1;
    DECLARE alphabet_abc VARCHAR ( 55 ) DEFAULT '';
    DECLARE sum_ascii INT DEFAULT 0;
    REPEAT
        SET alphabet_abc = SUBSTRING( word FROM index_count FOR 1 );
        SET sum_ascii = sum_ascii + ASCII( alphabet_abc );
        SET index_count = index_count + 1;
    UNTIL index_count > count_word 
    END REPEAT;
    RETURN sum_ascii;
END //

现在输入'abc'时,循环会执行3次:

  1. index_count=1:处理'a',sum=97,index变为2
  2. index_count=2:处理'b',sum=97+98=195,index变为3
  3. index_count=3:处理'c',sum=195+99=294,index变为4
    此时检查4>3,条件为真,循环终止,返回正确的总和294。

内容的提问来源于stack exchange,提问作者Allen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:05:22