从十进制转换为只使用字母的二十六进制,使得26变成aa。

3

我在Mysql中有CONV函数:

mysql> CONV(26,10,26)
      -> 10

但我想要像这样的东西:
mysql> CONV_LETTERS(26,10,26)
      -> aa

如何在MySQL中将十进制转换为二十六进制,但只使用字母,使数字26变为aa?

更新

我已经做到了:

delimiter //
CREATE PROCEDURE `base10_to_base26_letters`(IN `nr` BIGINT)
BEGIN

SET @letters='abcdefghijklmnopqrstuvwxyz';
select SUBSTRING(@letters,`nr`+1,1);

END//

更新2

试图将这个php函数转换为MySQL存储过程。

PHP函数:

function generateAlphabet($na) {
    $sa = "";
    while ($na >= 0) {
        $sa = chr($na % 26 + 65) . $sa;
        $na = floor($na / 26) - 1;
    }
    return $sa;
}

我的MySQL存储过程:

delimiter //
CREATE PROCEDURE `base10_to_base26_letters`(IN `nr` BIGINT)
BEGIN

SET @n=`nr`,@letters='abcdefghijklmnopqrstuvwxyz',@r='';
while @n>=0 do
set @n=@n/26-1,@r=concat(SUBSTRING(@letters,@n%26,1),@r);
end while;
select @r;

END//

为什么我尝试的任何数字都只得到 z?

3
问题不够清晰。在26进制中,小数点后第一位是26的倒数,因此小数点后第二位等于1,依此类推。你不能改变十进制数26在26进制中的表示,这是数学规律。请问您具体想要实现什么? - Mureinik
我想将数据库中的十进制数字“1000”转换为只包含字母的“alm” 26进制数字,以便在我的应用程序中使用适当的命名约定。 - Alqin
1
如果您想将“a”用作0,则26必须是“ba”,“aa”与“a”相同,而“aaa”。 - TZHX
1
恐怕这并不是数制的工作方式。 - TZHX
你在和密码学家玩吗?数字系统不是那样工作的。你知道零(0)在数学中是一个特殊的数字。数学家使用零表示世纪是有原因的。 - mootmoot
显示剩余5条评论
2个回答

3
我们正在使用PHP做这件事情:
private function numToB26($num)
{
    /* $num++; // Uncomment to use "Excel"-mapping, e.g. 1=A instead of 0=A */
    do {
        $val = ($num % 26) ?: 26;
        $num = ($num - $val) / 26;
        $b26 = chr($val + 64).($b26 ?: '');
    } while (0 < $num);
    return $b26;
}

1
我希望有一个MySQL的解决方案。在互联网上有一些PHP的发现,但没有MySQL的。 - Alqin
在PHP中,您有一个内置函数base_convert可以完成此操作。 - Eboubaker

0

这个存储函数将一个整数转换为26进制:

DROP FUNCTION IF EXISTS `base10to26`;
DELIMITER ;;

CREATE FUNCTION `base10to26`(`theNumber` INT(11) UNSIGNED) 
RETURNS VARCHAR(20) READS SQL DATA
BEGIN
    DECLARE colTxt VARCHAR(20);
    DECLARE value  INT(11);
    SET colTxt = '';

    REPEAT
        SET value  = theNumber % 26;
        IF value = 0 THEN SET value = 26; END IF;
        SET theNumber = (theNumber - value) / 26;
        SET colTxt = CONCAT(CHAR(value+64), colTxt);
    UNTIL theNumber = 0 END REPEAT;

    RETURN colTxt;
END;;
DELIMITER ;

应该将 IF value = 0 THEN value = 26; END IF; 改为 IF SET value = 0 THEN value = 26; END IF;,否则会出现错误。但是我想要的是将一个十进制随机数(如23565)转换为只使用字母计数的二十六进制数。而且,colNumrowNum 应该被改为类似于 Num 的名称。 - Alqin
@Alqin:你指出的错误已经修复,代码已更新以将单个数字转换为26进制。 - Dag Sondre Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接