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

MySQL 自定義函數生成隨機密碼字串

     編輯:MySQL 資料庫相關知識

在 MySQL 中直接生成指定長度的隨機字串(含大小寫字母、數字),可用於密碼、Token、驗證碼等場景。本文提供一個高效能的自定義函數 func_range_string_mod,支援動態指定長度。

函數定義

DELIMITER $$
USE `t_girl`$$
DROP FUNCTION IF EXISTS `func_range_string_mod`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `func_range_string_mod`(
    f_num INT UNSIGNED  -- 目標字串長度
) RETURNS VARCHAR(200) CHARSET latin1
BEGIN
    DECLARE i INT UNSIGNED DEFAULT 0;
    DECLARE v_result VARCHAR(200) DEFAULT '';
    DECLARE v_dict VARCHAR(200) DEFAULT '';
    -- 字元池:a-z, A-Z, 0-9
    SET v_dict = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    -- 擴充字元池至 200 字元,避免取模偏差
    SET v_dict = LPAD(v_dict, 200, v_dict);
    WHILE i < f_num DO
        -- 從字元池隨機取一字元
        SET v_result = CONCAT(v_result, SUBSTR(v_dict, CEIL(RAND() * 200), 1));
        SET i = i + 1;
    END WHILE;
    RETURN v_result;
END$$
DELIMITER ;

呼叫範例

-- 生成 20 字元長度的隨機密碼
SELECT func_range_string_mod(20);

輸出範例:k9Fm2XpL7qW3rT8yZ1vB

設計要點解析

  • 字元池擴充:使用 LPAD(v_dict, 200, v_dict) 將 62 字元池重複填充至 200 字元,配合 CEIL(RAND() * 200) 取整,使每字元被選中的機率均勻分佈。
  • 效能考量:迴圈在 SQL 層執行,適合中短字串(≤ 200 字元)。超長字串建議在應用層生成。
  • 字元集宣告:函數回傳 CHARSET latin1 以節省儲存空間;若需支援特殊符號,可擴充 v_dict 並改用 utf8mb4。

擴充建議

  • 新增參數控制是否包含特殊符號(如 !@#$%^&*)。
  • 結合 UUID() 或 RANDOM_BYTES()(MySQL 8.0+)實現加密級隨機性。
  • 建立預存程序批次生成並寫入資料表,滿足大量測試資料需求。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved