在 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) 取整,使每字元被選中的機率均勻分佈。CHARSET latin1 以節省儲存空間;若需支援特殊符號,可擴充 v_dict 並改用 utf8mb4。!@#$%^&*)。UUID() 或 RANDOM_BYTES()(MySQL 8.0+)實現加密級隨機性。