在測試資料生成、驗證碼產生或唯一標識符建立等場景中,常需直接在資料庫層產生隨機字串。MySQL 內建 RAND() 僅回傳浮點數,需結合字元集與迴圈邏輯封裝為函數方便複用。
-- 允許建立函數(主從同步環境必須)
SET GLOBAL log_bin_trust_function_creators = 1;
DROP FUNCTION IF EXISTS `rand_string`;
DELIMITER $$
CREATE FUNCTION `rand_string`(n INT)
RETURNS VARCHAR(255)
DETERMINISTIC
NO SQL
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
DECLARE rand_pos INT;
WHILE i < n DO
-- 取 1~62 之間隨機整數對應字元位置
SET rand_pos = FLOOR(1 + RAND() * 62);
SET return_str = CONCAT(return_str, SUBSTRING(chars_str, rand_pos, 1));
SET i = i + 1;
END WHILE;
RETURN return_str;
END$$
DELIMITER ;
-- 產生 10 碼隨機字串
SELECT rand_string(10);
-- 結果範例:aB3fG9hK2m
-- 批次產生測試資料
INSERT INTO `test_table` (`token`) VALUES (rand_string(32)), (rand_string(32)), (rand_string(32));
chars_str 變數內容。DETERMINISTIC 有助優化器快取,但因依賴 RAND() 實際非確定性,生產環境視複製策略決定是否保留。此函數提供純 SQL 方式靈活產生隨機字串,無需外部程式語言介入,適合資料庫腳本、預存程序或觸發器中直接呼叫。