从MySQL / PHP中的数字ID生成字母数字ID

时间:2010-10-30 18:44:48

标签: php mysql

我有一个基本的MySQL数据库,其中每一行都分配了一个唯一的递增ID号,但是我也希望每一行都有一个唯一的6个字符,字母数字ID也会递增。例如:

Row 1: ID = 1, Name = AAAAAA
Row 2: ID = 2, Name = AAAAAB
Row 3: ID = 3, Name = AAAAAC

数据库是通过PHP添加的,因此可以通过PHP和纯SQL来完成。

到目前为止,我一直在尝试构建一个PHP函数,它可以将数字ID转换为AlphaNumeric ID,但没有成功。

有人有什么建议吗?谢谢。

4 个答案:

答案 0 :(得分:6)

这样的东西应该起作用并产生唯一的ID(仅产生字母):

function alphaID($n)
{
    for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
        $r = chr($n%26 + 0x41) . $r;
    return str_pad($r, 6, 'A', STR_PAD_LEFT);
}

echo alphaID(0); // returns "AAAAAA"
echo alphaID(1); // returns "AAAAAB"
...
echo alphaID(8652); // returns "AAALTU"

答案 1 :(得分:2)

数字ID是唯一的。我不会在表中存储字母数字值(它违反了DB规范化的一些规则),除了数字id和字母数字id实际上是相同的值,没有意义双重存储值!如果可能的话(它应该是),只能使用数值进行查询(我假设它是你的主键)。

我会使用PHP函数将数字转换为字母数字(例如由Tatu Ulmanen发布),并在有理由显示字母数字时在页面中调用它。在MSSQL中,如果您不想依赖PHP,可以编写UDF以在需要时显示值。虽然我从来没有真正使用myssql进入存储函数等,所以不确定它是否可以用它做。

您也可以使用PHP的base_convert()函数

base_convert(35, 10, 36); //= convert '35' from base '10' to base '36' and you would get 'Z'

答案 2 :(得分:1)

一种简单的方法可以用基本的32或十六进制格式表示数字...一个简单快速的解决方案......

答案 3 :(得分:0)

你必须以艰难的方式做到这一点,然后首先使char列成为主要的,然后做一个插入装配器,查找当前最大字母数字值的全局变量并递增,然后将增量值分配给新插入的线。问题是,如果已经有一个特殊的字符串递增函数,或者如果你必须从字符串到整数进行一些强制转换,然后增加整数,然后再进行反向强制转换为字符串,我就不会这样做。