MySQL生成32个字符以上的随机字符串

9

我正在尝试在MySQL中生成一个36个字符的随机字符串,使用以下代码:

UPDATE my_table SET entity_uid = substring(MD5(RAND()) FROM 1 FOR 36);

但结果总是一个32个字符的字符串。有没有办法获得更长的字符串?

2
你需要这个36个字符的随机字符串用来做什么?值得注意的是,MD5()函数的范围仅限于十六进制字符,这并不像它本应该的那样“随机”。 - eggyal
1
使用 SELECT LOWER(HEX(RANDOM_BYTES(18))) 可以获得具有最佳随机性质的 36 个字符的字符串。 - caw
4个回答

12

一种选择是生成两个MD5哈希值,将它们连接在一起(总共64个十六进制字符),然后取其中的前36个字符:

SELECT SUBSTR(CONCAT(MD5(RAND()),MD5(RAND())),1,36)

(注意:MD5哈希值是128位;MySQL的MD5()函数返回32个十六进制字符。)


我尝试做类似的事情,但语法错误了,所以感谢您发布这个解决方案。 - Doahh
太好了,我已经使用这个命令生成了我的随机字符串。 - Rashedul Islam Sagor
你可以用LEFT(S, N)来代替SUBSTR(S, 1, N)。使用LEFT的一个好处是会让你感受到Commodore 64 Basic的怀旧之情。 - Hontvári Levente

10
如果您使用的是MySQL 5.7.4以上版本,您可以使用新增的RANDOM_BYTES函数:
 SELECT TO_BASE64(RANDOM_BYTES(40));

这将导致一个随机字符串,例如r633j3sfgE85f3Jz+3AEx6Xo6qPXPUZruNimhId18iy+J1qOgZyCgg==


1
这并不一定导致一个长度为40的字符串。 - dadykhoff
2
但是,SELECT LOWER(HEX(RANDOM_BYTES(20))) 应该保证40个字符。 - caw

3
UPDATE my_table SET entity_uid = UUID();

注意:UUID 函数旨在返回一个通用唯一标识符,这并不一定是“随机的”。在非 Linux 系统和没有网络接口(MAC 地址)的 Linux 系统上,MySQL 使用随机数来生成 UUID 的一部分。 - spencer7593

2

MD5会将散列值作为32个十六进制数字返回。

根据MySQL的说明:

计算字符串的MD5 128位校验和。如果参数为NULL,则返回值为32个十六进制数字的字符串或NULL。例如,返回值可以用作哈希键。有关有效存储哈希值的说明,请参见本节开头的注释。


真的 - 但这并不是回答 OP 问题的答案,对吧? - Pekka
1
抱歉打扰了,我找到答案了:UPDATE my_table SET entity_uid = UUID();这是一个更简单的方法。 - Doahh
1
@Pekka웃 我认为这解释了为什么他无法使用提供的代码获取超过32位的字符串。但是,你是正确的,它并没有提供替代方案。 - Hanky Panky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接