業務開發中常需生成隨機字符串(如驗證碼、唯一編碼、測試數據),MySQL 內建無現成函數,需組合現有函數或自定義 UDF。
SELECT SUBSTRING(MD5(RAND()), FLOOR(RAND()*26)+1, 6) AS rand_str;
RAND():產生 0~1 隨機小數。MD5():產生 32 位十六進制字符串(0-9, a-f)。FLOOR(RAND()*26)+1:隨機起始位置 1~26。SUBSTRING(..., 6):截取 6 位。DROP FUNCTION IF EXISTS rand_str;
CREATE FUNCTION rand_str(strlen SMALLINT) RETURNS VARCHAR(255)
BEGIN
DECLARE result_str VARCHAR(255) DEFAULT '';
SET result_str = SUBSTRING(MD5(RAND()), 32 - strlen, strlen);
RETURN result_str;
END;
調用:SELECT rand_str(10); 產生 10 位隨機串。仍受限於 MD5 字符集。
DROP FUNCTION IF EXISTS rand_str;
CREATE FUNCTION rand_str(strlen SMALLINT) RETURNS VARCHAR(255)
BEGIN
DECLARE randStr VARCHAR(255) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
DECLARE i SMALLINT DEFAULT 0;
DECLARE resultStr VARCHAR(255) DEFAULT '';
WHILE i < strlen DO
SET resultStr = CONCAT(SUBSTR(randStr, FLOOR(RAND() * LENGTH(randStr)) + 1, 1), resultStr);
SET i = i + 1;
END WHILE;
RETURN resultStr;
END;
randStr:自定義字符池,可按需增減特殊字符。FLOOR(RAND() * LENGTH(randStr)) + 1:隨機索引(1-based)。SUBSTR(..., 1):取單字符。CONCAT(new_char, resultStr):頭插法構建結果(亦可尾插)。WHILE 循環精確控制長度。SELECT rand_str(8); -- 如: aB3xY9zK SELECT rand_str(32); -- 如: 7kLp2mN8qW... (32位)
CREATE FUNCTION ... DETERMINISTIC 或使用 UUID_TO_BIN() 等內建函數替代。