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次:
- index_count=1:处理'a',sum=97,index变为2
- index_count=2:处理'b',sum=97+98=195,index变为3
- index_count=3:处理'c',sum=195+99=294,index变为4
此时检查4>3,条件为真,循环终止,返回正确的总和294。
内容的提问来源于stack exchange,提问作者Allen
相关产品推荐
相关产品推荐

