Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL将数字转换为字母表_Mysql - Fatal编程技术网

MySQL将数字转换为字母表

MySQL将数字转换为字母表,mysql,Mysql,我的表中有一个自动递增的transactionIDtype=MEDIUMINT(9)。我还想向我的用户显示一个独特的按字母顺序排列的4字符(可以随时间增长,但现在是4个字符)兑换代码。从我的transactionID(最好直接从SELECT语句)中导出此字母代码的最佳方法是什么 谢谢。:) 您可以使用事务id的值生成哈希 比如: 您还可以使用其他几种类似的函数。这主要取决于您想要使用的字母表 您可以使用将其转换为base64编码字符串,或者只需执行以下操作: select REPLACE(REP

我的表中有一个自动递增的transactionID
type=MEDIUMINT(9)
。我还想向我的用户显示一个独特的按字母顺序排列的4字符(可以随时间增长,但现在是4个字符)兑换代码。从我的transactionID(最好直接从
SELECT语句
)中导出此字母代码的最佳方法是什么


谢谢。:)

您可以使用事务id的值生成哈希

比如:


您还可以使用其他几种类似的函数。

这主要取决于您想要使用的字母表

您可以使用将其转换为base64编码字符串,或者只需执行以下操作:

select REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(your_number, '0', 'A')
, '1', 'B')
, '2', 'C')
, '3', 'D')
, '4', 'E')
, '5', 'F')
, '6', 'G')
, '7', 'H')
, '8', 'I')
, '9', 'J')
如果你想要自定义字母表

如果您想要短一点的,您可以选择稍微难一点的方式:

您使用9位十进制(最大值9999999),它转换为8位十六进制数字(0x3B9AC9FF),即4个字节。您可以做的是将数字分成4个二进制八位字节,将它们转换为字符,构造新字符串并将其馈送到
to_BASE64()

请注意,TO_BASE64()函数仅在wards上的MySQL 5.6中可用

现在,对于那些在旧版本上的人——我们不想徒手实现
base64
编码,不是吗?那么,让我们用一种更简单的方法:我们在这9个十进制数字中有30位,即30/6=5个字符,如果我们在字符(32)后使用64个连续字符的字母,这是我们不想使用的空格:

SELECT CONCAT(`enter code here`CHAR(FLOOR(your_number/(64*64*64*64))%64+33),CHAR(FLOOR(your_number/(64*64*64))%64+33),CHAR(FLOOR(your_number/(64*64))%64+33),CHAR(FLOOR(your_number/64)%64+64),CHAR(your_number%64+33))

这将创建一个4个字符(如您所见,很容易更改)的字符串,其中的字符来自MD5命令(因此在a-z和0-9范围内)。

可能可以使用
CASE WHEN()结束和存储过程

例如:

CREATE DEFINER = 'USERNAME'@'HOST' STORED PROCEDURE `ConvertNumberToAlphabetic`
BEGIN
SELECT 
(CASE
    WHEN (your_number = '1') THEN 'A'
    WHEN (your_number = '2') THEN 'B'
    WHEN (your_number = '3') THEN 'C'
    WHEN (your_number = '4') THEN 'D'
    WHEN (your_number = '5') THEN 'E'
    WHEN (your_number = '6') THEN 'F'
    WHEN (your_number = '7') THEN 'G'
    WHEN (your_number = '8') THEN 'H'
    WHEN (your_number = '9') THEN 'J'
    WHEN (your_number = '10') THEN 'K'
END) RedeemCode
FROM tblTransaction;
END

我只是在寻找类似这样的东西,我找到了一种使用函数的方法

CONV(9+your_number, 10, 36)
这将1转换为A,2转换为B等



其工作方式是添加9,然后转换为基数36,其中10表示A,11表示B等。

谢谢您的提示。MD5对我来说似乎有点长。如果可能的话,我希望得到一个4个字符的字母代码。如果我将散列的前四个字符作为子字符串,我还能保证唯一吗?@user1258600,字符长度越短,冲突的可能性就越大。@Starx据我所知,他试图为用户输入一个唯一的代码。更多字符-更多错误。在目标字母表中每个字符的64位和输入数字中的9位十进制数字,转换成30个二进制数字,我们可以得到30/6=5个字符,而没有任何冲突的可能性。@ DavidJashi,没有冲突的机会。第10000条记录会发生什么?@Starx什么都没有。它是五个6位字符,不是0到9之间的数字。我收到一个MySQL错误1305,表示
函数。to_BASE64不存在
。我在谷歌上搜索并确认函数名和
之间没有空格,但没有用。@user1258600嗯。太糟糕了。你能升级到MySQL 5.6吗?好的,看起来这个函数只是在MySQL版本5.6.1中添加的。我仍然在5.5.27上(@user1258600请稍等,我将编写一段稍长的代码以支持旧版本。@user1258600现在尝试此代码。更改
33
常量以使用不同的范围,但不要高于63-您将使用CHAR(127),这在普通键盘上键入不太方便。您可以在应用程序端创建兑换代码(例如,将ID的模数乘以26,通过将其转换为字符并向其添加48(查看ASCII表格了解其工作原理),将其转换为从a到Z的字符,除以26,重复操作,直到剩下0为止)或者,如果您知道赎回代码的最大长度,您可以通过执行类似于
CONCAT(CHAR(49+(id/(25*25*25)%25),CHAR(49+(id/(25*25))%25,CHAR(49+(id/25)%25),CHAR(49+(id/25)%25),CHAR(49+id%25))的操作将其烘焙到SQL端
后一种选择是否非常昂贵?我怀疑,它并没有做任何花哨的事情。它最大的罪恶是丑陋:)@戴维贾希:这真的是一个要求吗?我从问题中了解到的是:从select中获取唯一的4个字符仅用于显示。@AhsanShan 4个十六进制字符最多可提供65536个可能的排列。OP有9个数字,最多可提供100000000个排列。如果此格式中的数字是11、112、1123、1121,会发生什么情况有没有办法把它们转换成AA,AAB,AABC,AABA?
SELECT SUBSTRING(MD5(transactionId) FROM 1 FOR 4) AS RedemptionCode
CREATE DEFINER = 'USERNAME'@'HOST' STORED PROCEDURE `ConvertNumberToAlphabetic`
BEGIN
SELECT 
(CASE
    WHEN (your_number = '1') THEN 'A'
    WHEN (your_number = '2') THEN 'B'
    WHEN (your_number = '3') THEN 'C'
    WHEN (your_number = '4') THEN 'D'
    WHEN (your_number = '5') THEN 'E'
    WHEN (your_number = '6') THEN 'F'
    WHEN (your_number = '7') THEN 'G'
    WHEN (your_number = '8') THEN 'H'
    WHEN (your_number = '9') THEN 'J'
    WHEN (your_number = '10') THEN 'K'
END) RedeemCode
FROM tblTransaction;
END
CONV(9+your_number, 10, 36)