我有一个基本的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,但没有成功。
有人有什么建议吗?谢谢。
答案 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列成为主要的,然后做一个插入装配器,查找当前最大字母数字值的全局变量并递增,然后将增量值分配给新插入的线。问题是,如果已经有一个特殊的字符串递增函数,或者如果你必须从字符串到整数进行一些强制转换,然后增加整数,然后再进行反向强制转换为字符串,我就不会这样做。