首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 隨機密碼生成函數:支援純字母、純數字、混合模式

     編輯:MySQL 資料庫相關知識

MySQL 存儲函數實現隨機密碼生成

在資料庫層面生成隨機字串,可用於初始化密碼、Token、驗證碼等場景。本文提供一個靈活的存儲函數 func_rand_string,支援三種模式:純字母、純數字、字母數字混合(基於 UUID)。

函數定義

DELIMITER $$

CREATE FUNCTION `func_rand_string` (
    f_num TINYINT UNSIGNED,  -- 生成長度
    f_type TINYINT UNSIGNED  -- 1=字母 2=數字 3=混合
) RETURNS VARCHAR(32)
BEGIN
    DECLARE i INT UNSIGNED DEFAULT 0;
    DECLARE v_result VARCHAR(255) DEFAULT '';

    WHILE i < f_num DO
        IF f_type = 1 THEN
            -- a-z: ASCII 97-122
            SET v_result = CONCAT(v_result, CHAR(97 + CEIL(RAND() * 25)));
        ELSEIF f_type = 2 THEN
            -- 0-9: ASCII 48-57
            SET v_result = CONCAT(v_result, CHAR(48 + CEIL(RAND() * 9)));
        ELSEIF f_type = 3 THEN
            -- 利用 UUID 去掉連字符,按位取字符
            SET v_result = CONCAT(v_result, SUBSTRING(REPLACE(UUID(), '-', ''), i + 1, 1));
        END IF;
        SET i = i + 1;
    END WHILE;

    RETURN v_result;
END $$

DELIMITER ;

調用範例

-- 生成 12 位混合密碼
SELECT func_rand_string(12, 3);
-- 輸出示例:a3f9b2e8c1d4

-- 生成 8 位純數字驗證碼
SELECT func_rand_string(8, 2);
-- 輸出示例:48291056

-- 生成 16 位純字母 Token
SELECT func_rand_string(16, 1);
-- 輸出示例:xkqzmrbplwvjnhyt

原理解析

  • 模式 1/2:利用 RAND() 生成 0-1 隨機數,乘以範圍後 CEIL 取整,映射到 ASCII 碼。
  • 模式 3:UUID() 產生 36 字符(含 4 個連字符),REPLACE(...,'-','') 得到 32 字符十六進制串,按位截取,熵值極高。
  • 函數返回 VARCHAR(32),足夠覆蓋常見長度需求。

擴展建議

  1. 增加特殊字符支援:擴展 ASCII 映射表或引入自定義字符集字串 SUBSTRING('abc...!@#', RAND()*LEN+1, 1)。
  2. 加密安全場景:資料庫層隨機數非加密級,高安全需求(如密碼重置 Token)應在應用層使用 SecureRandom / os.urandom 生成。
  3. 批量生成:配合 INSERT ... SELECT func_rand_string(12,3) FROM dual UNION ALL ... 或存儲過程循環寫入臨時表。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved