首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 自定義隨機字符串函數三種實現:MD5 簡易版、封裝版、全字符集循環版

     編輯:MySQL 資料庫相關知識

需求背景

業務需生成隨機字符串(如優惠碼、邀請碼),MySQL 內建無現成函數,需自行組合實現。

方案一:MD5 簡易版(最短代碼)

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 開始**。
  • 缺點:字符集僅 16 進制,熵較低。

方案二:封裝為 UDF(可重用、可傳長度)

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;
  • 字符集含大小寫字母+數字(62 字符),熵大幅提升。
  • CONCAT 累加結果,SUBSTR 隨機取單字符。
  • 可擴展加入特殊符號(如 !@#$%)。

性能與適用場景

方案生成速度熵適用場景
MD5 簡易版極快低臨時測試、非安全場景
封裝版極快低需固定長度、頻繁調用
全字符集版中等(循環)高業務編碼、Token、驗證碼

調用示例

SELECT rand_str(8) AS code;  -- 如: aB3x9Kp2
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved