在 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 个符号)
我正在尝试使用函数在 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 个符号)