在 MySQL 中生成一个随机字符串

Generate a random string in MySQL

我正在尝试使用函数在 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 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5

有谁知道我该如何解决这个问题?

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

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

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

通过使用分隔符解决了,我不确定如何解决,但它有效 谢谢

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 ; 

这比 concat + substring 例程快。

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

当我测试插入 1M 随机数据时,md5 例程仅消耗 1/4(甚至更少)时间 concat + substring例程;

问题是 md5 字符串只包含 32 个字符,因此如果您需要更长的字符串,则必须手动生成更多的 md5 字符串并 substring 自己生成。

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 个符号)