在 MySQL 開發中,生成隨機字符串是常見需求,例如生成驗證碼、臨時密碼或唯一標識符。雖然 MySQL 內建了 RAND() 函數,但缺乏直接生成指定格式隨機字符串的功能。本文提供一個功能完整的自定義函數 rand_string,支援多種字符類型組合,滿足各類業務場景。
RAND() 與 SUBSTR() 組合實現隨機選取DROP FUNCTION IF EXISTS rand_string;
delimiter //
CREATE FUNCTION rand_string(l_num TINYINT UNSIGNED, l_type TINYINT UNSIGNED)
RETURNS VARCHAR(127)
BEGIN
-- Function: rand_string
-- Author: dbachina#dbachina.com
-- Date: 2010/5/30
-- l_num: 隨機字符串長度
-- l_type: 字符類型
-- 1. 0-9
-- 2. a-z
-- 3. A-Z
-- 4. a-zA-Z
-- 5. 0-9a-zA-Z
-- 範例: SELECT rand_string(12,5) random_string;
-- 結果: 3KzGJCUJUplw
DECLARE i INT UNSIGNED DEFAULT 0;
DECLARE v_chars VARCHAR(64) DEFAULT '0123456789';
DECLARE result VARCHAR(255) DEFAULT '';
IF l_type = 1 THEN
SET v_chars = '0123456789';
ELSEIF l_type = 2 THEN
SET v_chars = 'abcdefghijklmnopqrstuvwxyz';
ELSEIF l_type = 3 THEN
SET v_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
ELSEIF l_type = 4 THEN
SET v_chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
ELSEIF l_type = 5 THEN
SET v_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
ELSE
SET v_chars = '0123456789';
END IF;
WHILE i < l_num DO
SET result = CONCAT(result, SUBSTR(v_chars, CEIL(RAND() * (LENGTH(v_chars) - 1)), 1));
SET i = i + 1;
END WHILE;
RETURN result;
END;
//
delimiter ;
mysql> SELECT rand_string(12, 5) AS random_string;
+---------------+
| random_string |
+---------------+
| 3KzGJCUJUplw |
+---------------+
1 row in set (0.00 sec)