在資料庫層面生成隨機字串,可用於初始化密碼、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
RAND() 生成 0-1 隨機數,乘以範圍後 CEIL 取整,映射到 ASCII 碼。UUID() 產生 36 字符(含 4 個連字符),REPLACE(...,'-','') 得到 32 字符十六進制串,按位截取,熵值極高。VARCHAR(32),足夠覆蓋常見長度需求。SUBSTRING('abc...!@#', RAND()*LEN+1, 1)。SecureRandom / os.urandom 生成。INSERT ... SELECT func_rand_string(12,3) FROM dual UNION ALL ... 或存儲過程循環寫入臨時表。