RANDSTR
声明
RANDSTR(N, gen)
说明
该函数按照指定长度生成一个随机字符串,字符串中的字符包含 A-Z、a-z 和 0-9。
-
N为生成的随机字符串长度:- 当
N < 0时,返回NULL。 - 当
N = 0时,返回空字符串。 - 当
N > 0并且N <= max_allowed_packet时,返回长度为 N 的随机字符串。 - 当
N > max_allowed_packet时,返回NULL。其中max_allowed_packet为系统变量,默认值为 16777216。
- 当
-
gen为分布函数,可取值如下:- 常量,则每次调用
RANDSTR()都会生成相同的随机串。 - 返回整数值的随机函数,例如
RANDOM()。 - 分布函数,例如均匀分布、zipf 分布、高斯分布等。
- 常量,则每次调用
-
随 机串的生成算法:采用 LCG 算法生成 N 个随机值,据此选出 N 个字符组成随机串。所以当 N 很大时会消耗较多 CPU。例如下面生成了一个长度为 300 M 的随机串,耗时 1.7 秒。
SELECT LENGTH(RANDSTR(300000000, 1)) FROM DUAL;;
+------------------------------+
| LENGTH(RANDSTR(300000000,1)) |
+------------------------------+
| 300000000 |
+------------------------------+
1 row in set (1.73 sec)
示例
如下示例为通过 RANDSTR() 函数生成长度为 10 的随机字符串。
SELECT RANDSTR(10, RANDOM()) FROM TABLE(GENERATOR(7));
+-----------------------+
| RANDSTR(10, RANDOM()) |
+-----------------------+
| TGfdBAZ1BP |
| VvMbD2bChR |
| VNSB6MpgQw |
| 3QWYQYQVJ4 |
| CpyE58jM0o |
| vBvsJBGGmX |
| rg3Pkde0UJ |
+-----------------------+
7 rows in set (0.001 sec)
RANDSTR() 通过 gen 参数可以控制生成的随机字符串的频率。如下示例中,生成 1000 个长度为 1 的字符串,它们的分布符合 zipf 分布规律。
SELECT RANDSTR(1, ZIPF(1, 10, RANDOM())) s, COUNT(*) FROM TABLE(GENERATOR(1000)) GROUP BY s ORDER BY 1 ASC;
+------+----------+
| s | COUNT(*) |
+------+----------+
| 0 | 27 |
| 1 | 41 |
| 4 | 32 |
| 5 | 54 |
| 8 | 64 |
| 9 | 69 |
| C | 88 |
| D | 125 |
| G | 168 |
| H | 332 |
+------+----------+
10 rows in set (0.001 sec)
RANDSTR() 函数通过控制 N 参数的大小,可以生成长度不同的字符串,如下例所示。
SELECT RANDSTR(5, 40) FROM DUAL;
+----------------+
| RANDSTR(5, 40) |
+----------------+
| UU3g0 |
+----------------+
1 row in set (0.001 sec)
SELECT RANDSTR(1, 40) FROM DUAL;
+----------------+
| RANDSTR(1, 40) |
+----------------+
| U |
+----------------+
1 row in set (0.001 sec)
SELECT RANDSTR(0, 40) FROM DUAL;
+----------------+
| RANDSTR(0, 40) |
+----------------+
| |
+----------------+
1 row in set (0.001 sec)
SELECT RANDSTR(-1, 40) FROM DUAL;
+-----------------+
| RANDSTR(-1, 40) |
+-----------------+
| NULL |
+-----------------+
1 row in set (0.001 sec)
当 gen 为常量时,反复执行 RANDSTR() 函数,会生成相同的随机字符串,如下例所示。
SELECT RANDSTR(10, 1442) FROM TABLE(GENERATOR(7));
+-------------------+
| RANDSTR(10, 1442) |
+-------------------+
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
+-------------------+
7 rows in set (0.001 sec)
SELECT RANDSTR(10, 1442) FROM TABLE(GENERATOR(7));
+-------------------+
| RANDSTR(10, 1442) |
+-------------------+
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
+-------------------+
7 rows in set (0.001 sec)