SQL-基于存储为VARCHAR的10位整数创建唯一的字母数字

SQL-基于存储为VARCHAR的10位整数创建唯一的字母数字,sql,hex,varchar,alphanumeric,Sql,Hex,Varchar,Alphanumeric,我试图在SQL中模拟客户机在Excel中生成的函数。实际上,他们的一个企业数据库系统中有一个唯一的10位数字值(VARCHAR)作为主键。在另一个数据库中,它们需要唯一的5位字母数字标识符。他们希望5位字母数字值代表10位数字。因此,他们在excel中所做的是将10位数字分成几对,然后将每对数字转换成十六进制值,然后将它们重新缝合在一起 EXCEL公式为: =IF(VALUE(MID(A2,1,4))>0,DEC2HEX(VALUE(MID(A2,3,2)))&DEC2HEX(VALUE(MID

我试图在SQL中模拟客户机在Excel中生成的函数。实际上,他们的一个企业数据库系统中有一个唯一的10位数字值(VARCHAR)作为主键。在另一个数据库中,它们需要唯一的5位字母数字标识符。他们希望5位字母数字值代表10位数字。因此,他们在excel中所做的是将10位数字分成几对,然后将每对数字转换成十六进制值,然后将它们重新缝合在一起

EXCEL公式为:

=IF(VALUE(MID(A2,1,4))>0,DEC2HEX(VALUE(MID(A2,3,2)))&DEC2HEX(VALUE(MID(A2,5,2))&DEC2HEX(VALUE(MID(A2,1,2)))&DEC2HEX(VALUE(MID(A2,5,2))&DEC2HEX(VALUE(MID(A2,7,2))&DEC2HEX(VALUE(MID(MID(A2,9,2)))

我需要与此类似的SQL。当然,如果有人知道更好的方法来实现他们的目标,即基于10位数字的“5位字母数字标识符”,我洗耳恭听

2011年8月2日增补

首先,感谢大家的回复。很高兴看到有人愿意帮忙,甚至乐于助人!根据所有的回答,我倾向于告诉我的客户他们的意图是正确的,只是他们的方法不正确。我还想推荐一个解决方案。因此,挑战仍然存在,只是稍作修改:

挑战:在SQL中,获取一个10位的唯一数字字符串,并用尽可能少的字符以字母数字形式表示它。结果字符串也必须是唯一的


请注意,10位字符串中的前3-4个字符可能是零,可以将它们剥离以缩短生成的字母数字字符串。不需要,但可能有帮助

我发现你的问题很有趣(虽然我并不声称知道答案)-出于兴趣,我在谷歌上搜索了一下,发现这可能对你有所帮助

10^10 base 2的日志是33.219280948874

> return  math.log(10 ^ 10) / math.log(2)
33.219280948874
> = 2 ^ 33.21928
9999993422.9114
因此,它需要34位来表示这个数字。在十六进制中,这将需要34/4=8.5个字符,远远超过5个字符

> return  math.log(10 ^ 10) / math.log(16)
8.3048202372184
Excel宏将忽略10个字符字符串的前4(或6)个字符

你可以试着用16而不是16来编码。这将使您最多使用7个字符

> return  math.log(10 ^ 10) / math.log(36)
6.4254860446923
流行的编码将使您最多可以使用6个字符

> return  math.log(10 ^ 10) / math.log(64)
5.5365468248123
> return  math.log(10 ^ 10) / math.log(100)
5
即使是编码也不能让你降到5

> return  math.log(10 ^ 10) / math.log(85)
5.1829075929158
您需要以100为基数才能达到5个字符

> return  math.log(10 ^ 10) / math.log(64)
5.5365468248123
> return  math.log(10 ^ 10) / math.log(100)
5

没有100个可打印的ASCII字符,所以正如zkhr解释的那样,这是行不通的,除非您愿意超越ASCII。

这个问题本质上是不可能的。您有一个要转换为5位字母数字值的10位数字值。由于有10个数字字符,这意味着您的10位数字有10^10=10000个唯一值。由于有36个字母数字字符(26个字母+10个数字),因此您的5位数字有36^5=60 466 176个唯一值。您无法将一组100亿个元素映射为一组约6000万个元素

现在,让我们仔细看看您的客户机代码在做什么:

因此,他们在excel中所做的是将10位数字分成几对,然后将每对数字转换成十六进制值,然后将它们重新缝合在一起

这不是100%准确。excel代码从不使用前2位数字,而是对其余8位执行此操作。该算法有两个主要问题,从直觉上看可能不明显:

  • 两个10位数字可以映射到同一个5位数字。考虑数字1000000117和1000001701。1000000117的最后四位数字映射到11,其中10000001701的最后四位数字映射到11 1。这导致两者都映射到00111

  • 5位数字甚至可能不是5位数字!例如,100001616被映射到001010

  • 那么,什么是可能的解决方案?好吧,如果你不在乎5位数字是否唯一,在MySQL中你可以使用如下内容:

    hex(<NUMERIC VALUE> % 0xFFFFF)
    
    hex(%0xFFFFF)