我的表中有一个自动递增的 transactionID type=MEDIUMINT(9)
。我还想向我的用户显示一个独特的 4 个字符(可以随着时间的推移而增长,但现在是 4 个)按字母顺序排列的兑换代码。从我的 transactionID 派生这个字母代码的最佳方法是什么,最好是直接从SELECT statement
?
5 回答
这主要取决于您要使用的字母表。
您可以使用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))
我只是在寻找这样的东西,我找到了一种使用CONV函数的方法。
CONV(9+your_number, 10, 36)
这会将 1 转换为 A,将 2 转换为 B 等。
它的工作方式是添加 9,然后转换为基数 36,其中 10 是 A,11 是 B,等等。
也许可以使用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
SELECT SUBSTRING(MD5(transactionId) FROM 1 FOR 4) AS RedemptionCode
这将创建一个 4 字符(如您所见,易于更改)字符串,其中字符来自 MD5 命令(因此在 az 和 0-9 范围内)。