【问题标题】:Generate a random string in MySQL在 MySQL 中生成随机字符串
【发布时间】:2015-05-11 19:24:00
【问题描述】:

我正在尝试使用函数在 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
  • 这是我为 mysql 编写的第一个函数,所以我不知道我缺少什么括号?
  • 如果我在做我的第一个功能,我会从更简单的开始!!
  • 根据dev.mysql.com/doc/refman/5.0/en/while.html,mysql使用END WHILE

标签: mysql random


【解决方案1】:

这比concat + substring 例程要快。

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

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

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

【讨论】:

    【解决方案2】:

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

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

      【讨论】:

        【解决方案4】:

        这是通过使用分隔符解决的,我不确定如何,但它可以工作 谢谢

        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 ; 
        

        【讨论】:

          【解决方案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
          

          【讨论】:

          • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“AS BEGIN declare @chars nvarchar(25)”附近使用正确的语法
          • 尝试删除..AS.. 也许在MySql中它是这样工作的
          • 已经这样做了:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 5 行的“@chars nvarchar(25)”附近使用正确的语法
          • 用 NVARCHAR 代替 VARCHAR
          • 哦,是的,应该已经看到了。但仍然给出同样的错误
          猜你喜欢
          • 1970-01-01
          • 2017-08-01
          • 2011-06-30
          • 2010-11-23
          • 2016-07-31
          • 2022-06-22
          • 1970-01-01
          相关资源
          最近更新 更多