業務需生成隨機字符串(如優惠碼、邀請碼),MySQL 內建無現成函數,需自行組合實現。
SELECT SUBSTRING(MD5(RAND()), FLOOR(RAND()*26)+1, 6) AS rand_str;
RAND():0~1 隨機小數。MD5():產生 32 位十六進制字符串(0-9, a-f)。SUBSTRING(str, pos, len):從 pos 截取 len 字符,**pos 從 1 開始**。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); —— 仍為 16 進制字符。
DROP FUNCTION IF EXISTS rand_str;
CREATE FUNCTION rand_str(strlen SMALLINT) RETURNS VARCHAR(255)
BEGIN
DECLARE chars VARCHAR(255) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE i SMALLINT DEFAULT 0;
DECLARE result VARCHAR(255) DEFAULT '';
WHILE i < strlen DO
SET result = CONCAT(result, SUBSTR(chars, FLOOR(RAND()*LENGTH(chars))+1, 1));
SET i = i + 1;
END WHILE;
RETURN result;
END;
CONCAT 累加結果,SUBSTR 隨機取單字符。!@#$%)。| 方案 | 生成速度 | 熵 | 適用場景 |
|---|---|---|---|
| MD5 簡易版 | 極快 | 低 | 臨時測試、非安全場景 |
| 封裝版 | 極快 | 低 | 需固定長度、頻繁調用 |
| 全字符集版 | 中等(循環) | 高 | 業務編碼、Token、驗證碼 |
SELECT rand_str(8) AS code; -- 如: aB3x9Kp2