DBMS_RANDOM.STRING 是 Oracle 內建產生隨機字串的函數,支援大寫、小寫、混合、英數、可列印字元五種模式,常用於測試資料生成、臨時密碼、Token、檔案命名等場景。
函數語法
DBMS_RANDOM.STRING(opt CHAR, len NUMBER) RETURN VARCHAR2
參數 opt 選項對照表
| opt | 全稱 | 字元集 | 範例輸出 (len=10) |
| 'U' / 'u' | Uppercase | A-Z | XKQZJHFRPT |
| 'L' / 'l' | Lowercase | a-z | xkqzjhfrpt |
| 'A' / 'a' | Mixed case (Alpha) | a-z, A-Z | aXkQzJhFrP |
| 'X' / 'x' | Uppercase Alpha-Numeric | A-Z, 0-9 | XK7QZ9JHF2 |
| 'P' / 'p' | Printable (任何可列印) | ASCII 33-126 | Xk#7Qz$9Jh |
實戰範例
-- 1. 20 碼大寫隨機碼 (適合驗證碼、批次號)
SELECT DBMS_RANDOM.STRING('U', 20) FROM DUAL;
-- 2. 20 碼小寫隨機碼
SELECT DBMS_RANDOM.STRING('L', 20) FROM DUAL;
-- 3. 20 碼大小寫混合 (適合臨時密碼)
SELECT DBMS_RANDOM.STRING('A', 20) FROM DUAL;
-- 4. 20 碼大寫英數 (適合序列號、兌換碼)
SELECT DBMS_RANDOM.STRING('X', 20) FROM DUAL;
-- 5. 20 碼可列印字元 (含特殊符號,適合高強度密碼)
SELECT DBMS_RANDOM.STRING('P', 20) FROM DUAL;
進階應用:批次產生測試資料
-- 產生 1000 筆測試用戶:帳號 user_隨機8碼、密碼 隨機12碼英數
INSERT INTO test_users (username, password, created_dt)
SELECT 'user_' || DBMS_RANDOM.STRING('X', 8),
DBMS_RANDOM.STRING('X', 12),
SYSDATE
FROM DUAL
CONNECT BY LEVEL <= 1000;
注意事項
- 非加密安全:
DBMS_RANDOM 為偽隨機數產生器,**不可用於加密金鑰、Session Token 等安全敏感場景**,請改用 DBMS_CRYPTO.RANDOMBYTES
- 每次呼叫獨立,無種子控制,無法重現序列
- 長度
len 最大 2000 (VARCHAR2 上限)
- 12c+ 可搭配
DBMS_RANDOM.RANDOM 產生整數隨機數
對比:DBMS_RANDOM vs DBMS_CRYPTO
| 特性 | DBMS_RANDOM.STRING | DBMS_CRYPTO.RANDOMBYTES + RAWTOHEX |
| 用途 | 測試資料、非安全隨機碼 | 加密金鑰、Session ID、CSRF Token |
| 隨機性 | 偽隨機 (線性同餘法) | 加密安全隨機 (OS entropy pool) |
| 效能 | 極快 | 較慢 |
| 輸出格式 | 直接 VARCHAR2 | RAW → 需轉換 |
選型原則:「測試用 DBMS_RANDOM,安全用 DBMS_CRYPTO。」切勿混淆。