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

MySQL 自訂函數生成固定長度隨機字串:CHARSET、WHILE 迴圈、CONCAT 實戰

     編輯:MySQL 資料庫相關知識

建立函數


DELIMITER //

CREATE FUNCTION `rand_string`(n INT) RETURNS VARCHAR(255) CHARSET latin1
DETERMINISTIC
BEGIN
    DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    DECLARE return_str VARCHAR(255) DEFAULT '';
    DECLARE i INT DEFAULT 0;
    WHILE i < n DO
        SET return_str = CONCAT(return_str, SUBSTRING(chars_str, FLOOR(1 + RAND() * 62), 1));
        SET i = i + 1;
    END WHILE;
    RETURN return_str;
END //

DELIMITER ;

關鍵點解析

  • CHARSET latin1:字元集僅含 ASCII,避免多位元組截斷問題。
  • DETERMINISTIC:宣告確定性,允許在複製/備份時保留(MySQL 預設要求)。
  • RAND() 每次呼叫產生新隨機值,FLOOR(1 + RAND()*62) 產生 1~62 索引。
  • SUBSTRING(str, pos, 1) 取單字元,CONCAT 累加。

使用範例


-- 更新指定行
UPDATE demotable SET demoname = rand_string(32) WHERE id > 23;

-- 查詢產生
SELECT rand_string(16) AS token;

-- 批次產生 100 組
SELECT rand_string(32) FROM (
    SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
    UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) t1 CROSS JOIN (
    SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
    UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) t2;

效能與替代方案

方案適用場景速度
SQL 函數 + WHILE少量、邏輯在 DB 端慢(逐行執行)
應用層生成 (PHP/Python/Go)大量、高併發、需加密安全快、靈活
UUID() / UUID_SHORT()需唯一識別碼、不需自訂字元集極快、內建
RANDOM_BYTES(16) + HEX()MySQL 8.0+,加密安全隨機快、標準

安全提醒

RAND() 非加密安全,**不可用於 Token、密碼重設、Session ID** 等安全敏感場景。請用應用層 random_bytes() / openssl_random_pseudo_bytes() 或 MySQL 8.0 RANDOM_BYTES()。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved