在MySQL中生成随机字符串

11

我正在尝试使用一个函数在phpmyadmin中获取一个随机字符串。 我有以下代码:

CREATE FUNCTION randomPassword()
RETURNS varchar(128)
BEGIN

    SET @chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    SET @charLen = length(@chars);

    SET @randomPassword = '';

    WHILE length(@randomPassword) < 12
        SET @randomPassword = concat(@randomPassword, substring(@chars,CEILING(RAND() * @charLen),1));
    END WHILE;

    RETURN @randomPassword ;
END;

现在我遇到了错误:

1064 - 您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方法,位于第5行附近

有人知道我怎么能修复这个错误吗?


END WHILE 是错误的。你只需要在 WHILE 循环的结尾处写 END。 - Galma88
这是我第一次编写mysql函数,所以我不知道我缺少哪些括号? - WillemKoonings
如果我正在编写我的第一个函数,我会从更简单的东西开始! - Strawberry
根据 http://dev.mysql.com/doc/refman/5.0/en/while.html ,mysql使用END WHILE。 - WillemKoonings
我之前在Oracle PL/SQL中编写过函数,但在MySQL中没有。 - WillemKoonings
显示剩余2条评论
5个回答

25

这比使用concat + substring例程更快。

select substring(MD5(RAND()),1,20);

我已经测试过插入一百万个随机数据,md5例程只消耗了concat + substring例程的1/4(甚至更少)的时间;

问题是md5字符串只包含32个字符,所以如果你需要更长的字符串,你必须手动生成更多的md5字符串并自行使用substring.


10

试试这个更简单的解决方案:

SELECT CONV(FLOOR(RAND() * 99999999999999), 10, 36)

3
SELECT SUBSTRING(REPLACE(REPLACE(REPLACE( TO_BASE64(MD5(RAND())), '=',''),'+',''),'/',''), 2, 40)

这是一种生成固定长度的随机字符串的解决方案,包含所有小写字母、大写字母和数字。

SELECT SUBSTRING(REPLACE(REPLACE(REPLACE( TO_BASE64(MD5(RAND())), '=',''),'+',''),'/',''), 2, FLOOR(10+RAND()*31))

如果你需要一个随机长度的字符串(例如从 10 到 40 个字符的字符串),请使用以下方法:

2

通过使用分隔符解决了这个问题,我不确定具体是如何实现的,但它有效。谢谢。

DELIMITER $$
CREATE FUNCTION randomPassword()
RETURNS varchar(128)
BEGIN

SET @chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
SET @charLen = length(@chars);

SET @randomPassword = '';

WHILE length(@randomPassword) < 12
    DO
    SET @randomPassword = concat(@randomPassword, substring(@chars,CEILING(RAND() * @charLen),1));
END WHILE;

RETURN @randomPassword ;
END$$
DELIMITER ; 

0
CREATE FUNCTION randomPassword()
RETURNS varchar(128)
AS
BEGIN

declare @chars nvarchar(25);
declare @charlen int;
declare @randomPassword nvarchar(128);

SET @chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
SET @charLen = len(@chars);

SET @randomPassword = '';

WHILE(LEN(@randomPassword) < 12)
BEGIN
    SET @randomPassword = concat(@randomPassword, substring(@chars,CEILING(RAND() * @charLen),1));
END

RETURN @randomPassword
END

#1064 - 您的 SQL 语法有误;请检查与您的 MySQL 服务器版本相对应的手册,以获取在第 3 行使用正确语法的方法:BEGINdeclare @chars nvarchar(25) - WillemKoonings
尝试删除 ..AS..,也许在 MySql 中可以这样工作。 - Galma88
#1064 - 您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方式。第5行附近出现了'@chars nvarchar(25)'。 - WillemKoonings
将 NVARCHAR 替换为 VARCHAR。 - Galma88
哦,是啊,应该看到那个了。但是还是会出现相同的错误。 - WillemKoonings

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