1

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

4

5 回答 5

2

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

您可以使用TO_BASE64将其转换为 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 位十进制数(最大 999999999),它转换为 8 个十六进制数字 (0x3B9AC9FF),即 4 个字节。您可以做的是将您的数字分成 4 个二进制八位字节,将它们转换为字符,构造新字符串并将其提供给TO_BASE64()

select TO_BASE64(CONCAT(CHAR(FLOOR(your_number/(256*256*256))%256),CHAR(FLOOR(your_number/(256*256))%256),CHAR(FLOOR(your_number/256)%256),CHAR(your_number%256)))

请注意, TO_BASE64() 函数仅在 MySQL 5.6 及更高版本中可用。

现在,对于那些使用旧版本的人 - 我们不想base64徒手实现编码,不是吗?所以,让我们走更简单的方法:我们在这 9 个十进制数字中有 30 位,这将是 30/6=5 个字符,如果我们在 CHAR(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))
于 2013-07-04T05:24:29.203 回答
2

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

CONV(9+your_number, 10, 36)

这会将 1 转换为 A,将 2 转换为 B 等。

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

于 2020-04-20T15:56:37.853 回答
0

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

喜欢:

SELECT MD5(transactionID) FROM `yourtable`;

您可以使用其他几种类似的功能。

于 2013-07-04T05:16:43.930 回答
0

也许可以使用CASE WHEN() END;存储过程

例如:

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
于 2018-04-10T09:35:44.680 回答
-1
SELECT SUBSTRING(MD5(transactionId) FROM 1 FOR 4) AS RedemptionCode

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

于 2013-07-04T05:32:47.400 回答