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()。