宣言
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消費量が多くなります。例えば、以下のように長さ300Mのランダム文字列を生成するのに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