超过32个字符的MySQL随机字符串

超过32个字符的MySQL随机字符串,mysql,Mysql,我尝试在MySQL中使用以下方法生成一个36个字符的随机字符串: UPDATE my_table SET entity_uid = substring(MD5(RAND()) FROM 1 FOR 36); 但结果总是32个字符的字符串。有没有办法获取更长的字符串?MD5将哈希值作为32个字符的十六进制数返回 据 计算字符串的MD5 128位校验和。价值是 以32个十六进制数字的字符串返回,如果参数为空,则返回NULL 无效的例如,返回值可以用作哈希键。看见 本节开头关于存储哈希值的注释 效率

我尝试在MySQL中使用以下方法生成一个36个字符的随机字符串:

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

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

MD5将哈希值作为32个字符的十六进制数返回

计算字符串的MD5 128位校验和。价值是 以32个十六进制数字的字符串返回,如果参数为空,则返回NULL 无效的例如,返回值可以用作哈希键。看见 本节开头关于存储哈希值的注释 效率高


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

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

(注意:MD5散列为128位;MySQL MD5()函数返回32个十六进制字符。)

如果使用版本高于5.7.4的MySQL,可以使用新添加的函数:

 SELECT TO_BASE64(RANDOM_BYTES(40));

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

True-但这不是OP问题的真正答案,是吗?很抱歉,我找到了答案:更新我的表集实体\u uid=UUID();这是一种更简单的方法。@Pekka웃 我想这就是为什么他不能用他提供的代码获得超过32位的字符串。是的,你是对的,它没有提供替代方案。我尝试过这样做,但得到了错误的语法,因此感谢发布该解决方案。太好了,我已经使用此命令生成了我的随机字符串。您可以编写左(S,N)而不是SUBSTR(S,1,N)。使用LEFT的一个很好的副作用是怀旧Commodore 64 Basic。您需要这个36个字符的随机字符串做什么?可能值得注意的是,
MD5()
的范围仅限于十六进制字符,而不是尽可能的“随机”。使用
选择下限(十六进制(随机字节(18)))
应为您提供36个具有最佳随机性属性的字符串。注意:
UUID
函数用于返回通用唯一标识符。这不一定是“随机的”。MySQL在非Linux系统和没有网络接口(MAC地址)的Linux系统上使用随机数生成部分UUID。这不一定会生成长度为40的字符串。但是
选择较低的(十六进制(随机字节(20))
应该保证40个字符。
 SELECT TO_BASE64(RANDOM_BYTES(40));