乱数、文字列、日付、検証コード、UUIDを生成するMySQLメソッド

乱数、文字列、日付、検証コード、UUIDを生成するMySQLメソッド

前回の記事では、Oracle で乱数、文字列、日付、検証コード、UUID を生成する方法を紹介しました。今日は引き続き、MySQL でさまざまなランダム データを生成する方法について説明します。

📝コンピューターによって生成されるすべての数字は疑似乱数であり、実際の物理的な乱数ではありません。

乱数を生成する

0から1までの乱数を生成する

MySQL の RAND 関数を使用すると、0 以上 1 未満の乱数を生成できます。例えば:

rand() を選択する;
ランド() |
------------------|
0.7245639057127423|

rand() を選択する;
ランド() |
-------------------|
0.01697599982561171|

この関数は、小数点以下 16 桁の double 値を返します。呼び出しごとに異なるデータが返されます。

特定のシナリオを再現したい場合は、実行するたびに同じ乱数を生成するようにする必要があります。この場合、RAND 関数に入力パラメータを渡して乱数シードを設定できます。例えば:

ランド(1)を選択します。
ランド(1) |
-------------------|
0.40540353712197724|

ランド(1)を選択します。
ランド(1) |
-------------------|
0.40540353712197724|

結果から、同じシードが同じ乱数を返すことがわかります。

指定された範囲内で乱数を生成します

RAND 関数と数学演算に基づいて、任意の 2 つの数値間のランダムな数値を返すことができます。

最低 + RAND() * (最高 − 最低)

上記の式は、low 以上で high 未満の乱数を返します。例えば:

10 + rand(1) * 10を選択します。
10 + ランド(1) * 10 |
------------------|
14.054035371219772|

上記の例では、10 以上 20 未満の乱数を返します。

特定の範囲内でランダムな整数を生成する場合は、FLOOR 関数を追加できます。例えば:

floor(10 + rand(1) * (10)) を rd として選択します。
rd |
----|
14.0|

このステートメントは、10 以上 19 (20 ではない) 以下のランダムな整数を返します。

6桁のモバイル認証コードを生成する

指定された範囲内でランダムな整数を取得し、LPAD 関数と組み合わせて、6 桁の携帯電話認証コードを生成できます。例えば:

SELECT lpad(floor(rand(999) * 1000000), 6, '0') AS captcha;
キャプチャ|
-------|
088146 |

lpad 関数を使用すると、データが 6 ビット未満の場合に先頭に 0 が追加されることが保証されます。

正規分布に従って乱数を生成します

RAND 関数は、均一分布に従う乱数を生成します。MySQL には、正規分布に従う乱数を生成する関数は用意されていません。正規分布する乱数をシミュレートするための保存関数を作成できます。

区切り文字 //
関数 normal_distrib(mean double, stdev double) を作成します。 
double no sql を返します
始める
@x = rand()、@y = rand() を設定します。
@nd = (sqrt(-2 * log(@x)) * cos(2 * pi() * @y)) * stdev + 平均を設定します。
@nd を返します。
終わり
//
区切り文字 ;

上記の関数は、Box-Muller 変換アルゴリズムを使用して、均等に分布した 2 つの乱数から正規分布した乱数を生成します。

次のステートメントは、normal_distrib 関数を使用して、期待値が 0、標準偏差が 1 の正規分布の乱数を生成します。

normal_distribub(0,1)を選択します。
通常の分布(0,1)|
-------------------|
 1.4930564399841173|

次のステートメントを使用して、normal_distrib 関数が正規分布に従うかどうかを確認できます。

再帰temp(val)を(
 normal_distribub(0,1)を選択
 すべて結合
 normal_distribub(0,1)を選択
 一時から
 制限 1000000
)
/*+ set_var(cte_max_recursion_depth = 1m) */avg(val),std(val) を選択
一時から;
平均(値) |標準偏差(値) |
---------------------|------------------|
-0.002340136192616743|0.9994844557755181|

このデータを 1,000,000 回実行し、平均と標準偏差を計算すると、返される結果は 0 と 1 に非常に近くなります。

ランダムな文字列を生成する

固定長のランダム文字列を生成する

乱数に加えて、ランダムな文字列を生成する必要がある場合もあります。 MySQL にはランダムな文字列を生成するための特別な関数は用意されていませんが、他の関数を通じてシミュレートできます。例えば:

char(floor(rand() * 26)+65) を rand_char として選択します。
ランド文字|
---------|
翻訳

上記のクエリはランダムな大文字を返します。char 関数は、ASCII コードを対応する文字に変換するために使用されます。このクエリに基づいて、さらにストアド関数を作成できます。

区切り文字 //
関数 rand_string(len integer) を作成します。 
テキストを返します。SQLなし
始める
 カウンター int のデフォルトを 1 と宣言します。
 str テキストのデフォルトを宣言します '';
 
 長さ<1の場合
 null を返します。
 終了の場合;
 
 カウンタ<=長さの間
 str = concat(str, char(floor(rand() * 94) + 33)) と設定します。
 カウンタをカウンタ + 1 に設定します。
 終了しながら;
 
 str を返します。
終わり
//
区切り文字 ;

rand_string 関数は、任意の印刷可能な文字 (ASCII コード 33 から 126) で構成されるランダムな文字列を返します。例えば:

ランダ文字列(8)|
--------------|
7j5dz[58 |

上記の例では、印刷可能な文字で構成される長さ 8 のランダムな文字列を返します。

さらに、MySQL の elt 関数を使用して、指定した位置の要素を返すこともできます。例えば:

SELECT elt(1 + floor(rand() * 36)、
   0、1、2、3、4、5、6、7、8、9、 
   「A」、「B」、「C」、「D」、「E」、「F」、「G」、
   'H'、'I'、'J'、'K'、'L'、'M'、'N'、
   「O」、「P」、「Q」、「R」、「S」、「T」、
   'U'、'V'、'W'、'X'、'Y'、'Z') を val として指定します。
ヴァル|
---|
翻訳:

上記のステートメントは、ランダムな数字または大文字を返します。これを rand_string 関数に代入すると、数字と大文字で構成されるランダムな文字列を返すことができます。

可変長のランダムな文字列を生成します

では、可変長のランダムな文字列を返すにはどうすればよいでしょうか?とても簡単です。rand_string 関数にランダムな長さのパラメータを指定するだけです。例えば:

rand_string(floor(10 + rand() * 11))を選択します。
rand_string(floor(10 + rand() * 11))|
------------------------------------|
4U13MjO+($}k"cO@5%[ |

上記の例では、長さが 10 以上 20 以下の印刷可能な文字のランダムな文字列を返します。

ランダムな日付と時刻を生成する

指定した日付に乱数を加えることでランダムな日付を取得できます。例えば:

SELECT date_add('2020-01-01', 間隔 rand() * 31 日) rand_date;
日付 |
----------|
2020-01-19|

上記の例では、2020 年 1 月のランダムな日付が返されます。次のステートメントは、ランダムな時刻を返します。

sec_to_time(rand() * 3600) を選択して rand_time を実行します。
ランダム時間 |
------------------|
00:05:29.546878000|

その中で、sec_to_time 関数は秒を時間データに変換するために使用されます。

テーブルからランダムなレコードを取得する

複数行のデータを返すクエリ ステートメントの場合、RAND 関数は毎回異なるランダム データを返します。例えば:

従業員からrand(1)を選択します。
ランド(1) |
--------------------|
 0.40540353712197724|
 0.8716141803857071|
 0.1418603212962489|
...

この機能を使用すると、テーブルからランダムなデータ行を返すことができます。例えば:

従業員ID、従業員名を選択
従業員より
順序: rand(1)
制限5;
従業員ID|従業員名 |
------|-----------|
  6|魏延|
 14|張宝|
 16|周蒼|
 15|趙通|
  1|劉備|

上記の例では、従業員テーブルからランダムに 5 行が返されます。この方法では、テーブル内の各データ行に対して乱数を生成し、それを並べ替える必要があるため、テーブル内のデータ量が増えるにつれて徐々に速度が低下します。

テーブルに自動増分主キーがある場合は、主キーに基づいてランダムデータを生成することもできます。例えば:

SELECT round(rand() * (SELECT max(emp_id) FROM employee)) AS id;
id |
----|
10.0|

次に、この乱数に基づいてランダムなレコードを返します。

e.emp_id、e.emp_nameを選択します
従業員より
内部結合 (SELECT round(rand() * (SELECT max(emp_id) FROM employee)) AS id
  ) として
e.emp_id >= t.id の場合
制限 1;
従業員ID|従業員名|
------|---------|
  9|趙雲|

このメソッドは一度に 1 つのランダム レコードのみを返すことができ、自動インクリメント フィールドの値にギャップがない場合にのみ、均一に分散されたランダム レコードを返します。

UUIDの生成

UUID(Universal Unique Identifier)またはGUID(Globally Unique Identifier)は、各ネットワーク オブジェクトまたはリソースを一意に識別するために使用できる 128 ビットの数値です。 UUID は、その生成メカニズムにより、他の UUID と重複することがほとんどないことが保証されているため、データベースの主キー値を生成するためによく使用されます。

MySQL には、UUID を生成するために使用できるシステム関数 UUID が用意されています。例えば:

uuid() を選択します。
uuid() |
------------------------------------|
35f67fde-e0e9-11ea-9d25-0800272142b1|

ハイフン (-) なしの UUID を生成する場合は、REPLACE 関数を使用できます。

SELECT replace(uuid(),'-','');
置換(uuid(),'-','') |
--------------------------------|
8505290be0ea11ea9d250800272142b1|

さらに、MySQL には、64 ビットの符号なし整数を返すことができる UUID_SHORT 関数も用意されています。例えば:

uuid_short() を選択する;
uuid_short() |
-----------------|
98862025337208832|

この関数は、次の条件が満たされた場合にのみ一意となる「短い」一意の識別子を返します。

  • 現在のサーバーの server_id は 0 ~ 255 の範囲で、レプリケーション構造内で一意です。
  • mysqld を再起動する前と再起動後に、サーバー ホストのシステム時刻が調整されませんでした。
  • 1秒あたりの平均通話数は1,600万件未満です。

要約する

この記事では、乱数、検証コード、ランダム文字列、ランダムな日付と時刻など、MySQL データベースでランダム データを生成する方法を紹介します。また、テーブルからランダム レコードを返す方法と UUID を生成する方法についても紹介します。

MySQL で乱数、文字列、日付、検証コード、UUID を生成する方法についての記事はこれで終わりです。MySQL で乱数と UUID を生成する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL の主キーがクエリを高速化するために数値を使用するか UUID を使用するかについての簡単な分析
  • Mysql 主キー UUID と自動増分主キーの違いと利点と欠点
  • MySQL が uuid または snowflake id を主キーとして使用することを推奨しない理由の詳細な分析
  • Mysql でサーバーの UUID を変更する方法
  • Mysql で UUID を保存するときに水平線を削除する方法
  • なぜMySQLはテーブルの主キーを分析および設計する際にUUIDを使用しないのですか?

<<:  スクロール画像バーを実現するための CSS サンプルコード

>>:  Docker ビルド kubectl イメージ実装手順

推薦する

Linux での MySQL 5.6 バイナリのインストール プロセス

1.1 バイナリインストールパッケージをダウンロードするhttps://dev.mysql.com/...

Windows10システムにMySQL 5.7.17をインストールする

オペレーティング システム win10 MySQL は、公式 Web サイトからダウンロードした 6...

HTML で 2 列レイアウトを実装する方法の例 (左側は固定幅、右側は適応幅)

HTMLは2列レイアウトを実装し、左側は固定幅、右側は適応幅です。実装1: <スタイル>...

Windows での PyTorch 開発環境のインストール チュートリアル

アナコンダのインストールAnaconda は、Python の使用を容易にするために作成されたソフト...

MySQL トランザクション分析

取引トランザクションはビジネス ロジックの基本単位です。各トランザクションは一連の SQL ステート...

MySQL でコミットされていないトランザクション情報を見つける方法

少し前に、「ORACLE でコミットされていないトランザクションの SQL ステートメントを見つける...

フレームセットを使用してワイドスクリーンを中央に配置するためのヒントを共有する

コードをコピーコードは次のとおりです。 <フレームセット cols="*,1280,...

js での typeof の使い方を理解するための記事

目次ベース戻り値の型文字列とブール値数値とbigintシンボル未定義関数物体他のよくある質問参照エラ...

MySQLの数値型自動増分における落とし穴

テーブル構造を設計する場合、数値型は最も一般的な型の 1 つですが、数値型をうまく使用するのは想像す...

Linux での MySQL 5.6.33 のインストールと設定のチュートリアル

このチュートリアルでは、LinuxでのMySQL 5.6.33のインストールと設定方法を参考までに紹...

CSSは5つの一般的な2D変換を実装します

CSS の 2D 変換を使用すると、移動、回転、拡大縮小、変形などの基本的な変換操作を 2 次元空間...

ウェブサイトデザインの基礎知識:初心者の方はぜひお読みください

今では多くの人がウェブサイト作成に参加していますが、ウェブサイトはどのように作成すればよいのでしょう...

iframe を介してフレームセットを本体に配置する

フレームセットと本文は同じレベルにあるため、本文にフレームセットを配置することはできません。まずペー...

WAMPにインストールするとMySQLが起動できるが、再起動後に起動できなくなる問題の解決方法

初めてwampをインストールした後、すべてのサービスが正常に使用できますが、再起動するとwampのア...

scss で mixin が動作しない問題の解決方法 (ブラウザでコンパイルできない)

ミックスインメソッド: ブラウザはコンパイルできません: 以前のバージョンのsassでは上記の記述方...