宣言
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 MB のランダム文字列を生成するのに 1.7 秒かかりました。
obclient> SELECT LENGTH(RANDSTR(300000000, 1)) FROM DUAL;; +------------------------------+ | LENGTH(RANDSTR(300000000,1)) | +------------------------------+ | 300000000 | +------------------------------+ 1 row in set (1.73 sec)
例
以下の例では、RANDSTR() 関数を使用して、長さ10のランダム文字列を生成します。
obclient> SELECT RANDSTR(10, RANDOM()) FROM TABLE(GENERATOR(7));
+-----------------------+
| RANDSTR(10, RANDOM()) |
+-----------------------+
| TGfdBAZ1BP |
| VvMbD2bChR |
| VNSB6MpgQw |
| 3QWYQYQVJ4 |
| CpyE58jM0o |
| vBvsJBGGmX |
| rg3Pkde0UJ |
+-----------------------+
7 rows in set
RANDSTR() は、gen パラメータによって生成されるランダム文字列の頻度を制御できます。以下の例では、長さ1の文字列を1000個生成し、その分布がZipf分布の法則に従うことを示しています。
obclient> 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
RANDSTR() 関数は、N パラメータの値を調整することで、異なる長さの文字列を生成できます。以下の例がそれを示しています。
obclient> SELECT RANDSTR(5, 40) FROM DUAL;
+----------------+
| RANDSTR(5, 40) |
+----------------+
| UU3g0 |
+----------------+
1 row in set
obclient> SELECT RANDSTR(1, 40) FROM DUAL;
+----------------+
| RANDSTR(1, 40) |
+----------------+
| U |
+----------------+
1 row in set
obclient> SELECT RANDSTR(0, 40) FROM DUAL;
+----------------+
| RANDSTR(0, 40) |
+----------------+
| |
+----------------+
1 row in set
obclient> SELECT RANDSTR(-1, 40) FROM DUAL;
+-----------------+
| RANDSTR(-1, 40) |
+-----------------+
| NULL |
+-----------------+
1 row in set
gen が定数の場合、RANDSTR() 関数を繰り返し実行しても、同じランダム文字列が生成されます。以下の例がそれを示しています。
obclient> SELECT RANDSTR(10, 1442) FROM TABLE(GENERATOR(7));
+-------------------+
| RANDSTR(10, 1442) |
+-------------------+
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
+-------------------+
7 rows in set
obclient> SELECT RANDSTR(10, 1442) FROM TABLE(GENERATOR(7));
+-------------------+
| RANDSTR(10, 1442) |
+-------------------+
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
| 4dTm5bOtGc |
+-------------------+
7 rows in set