跳到主要内容

RANDSTR

声明

RANDSTR(N, gen)

说明

该函数按照指定长度生成一个随机字符串,字符串中的字符包含 A-Za-z0-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)