2013-01-21 41 views
4

我试图使用生成MySQL中的36字符的随机字符串长:MySQL的随机字符串超过32个字符

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

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

+0

concat几个字符串? – Shomz

+2

你需要这个36个字符的随机字符串* for *?值得注意的是,'MD5()'的范围仅限于十六进制字符,而不是像它那样“随机”。 – eggyal

回答

0
UPDATE my_table SET entity_uid = UUID(); 
+0

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

2

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

根据MySQL

为字符串算出一个MD5 128位校验和。值为 作为32位十六进制数字的字符串返回,如果参数为NULL,则返回NULL。例如,返回值可以用作散列键。请参阅本节开头的注释 ,以便高效地存储散列值 。

+0

确实 - 但不是OP的问题的答案,是吗? –

+0

对不起,我找到了答案: UPDATE my_table SET entity_uid = UUID(); \t 这是一个更简单的方法来做到这一点。 – Doahh

+1

@Pekka웃我认为这答案为什么他不能使用他提供的代码获取长度超过32位的字符串。但是,是的,你是对的,它不提供替代 –

5

一种选择是产生两个MD5散列,一起将它们连接起来(总共64个十六进制字符),然后取的第一36个字符:

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

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

+0

我试图做这样的事情,但得到了错误的语法,所以感谢张贴该解决方案。 – Doahh

+0

太好了,我用这个命令生成了我的随机字符串。 –

6

如果使用MySQL比5.7.4版本更高,则可以使用新添加的功能RANDOM_BYTES

SELECT TO_BASE64(RANDOM_BYTES(40)); 

这将产生一个随机字符串,如r633j3sfgE85f3Jz+3AEx6Xo6qPXPUZruNimhId18iy+J1qOgZyCgg==