MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  MySQL Enterprise Data Masking and De-Identification ユーザー定義関数の説明

6.5.5 MySQL Enterprise Data Masking and De-Identification ユーザー定義関数の説明

MySQL Enterprise Data Masking and De-Identification プラグインライブラリには、次のカテゴリにグループ化できるいくつかのユーザー定義関数 (UDF) が含まれています:

MySQL 8.0.19 では、これらの UDF は文字列引数および戻り値のシングルバイト latin1 文字セットをサポートしています。 MySQL 8.0.19 より前では、UDF は文字列引数をバイナリ文字列として扱い (大文字と小文字を区別しない)、文字列の戻り値はバイナリ文字列です。 戻り値の文字セットの違いは、次のとおりです:

MySQL 8.0.19 以上:

mysql> SELECT CHARSET(gen_rnd_email());
+--------------------------+
| CHARSET(gen_rnd_email()) |
+--------------------------+
| latin1                   |
+--------------------------+

MySQL 8.0.19 より前:

mysql> SELECT CHARSET(gen_rnd_email());
+--------------------------+
| CHARSET(gen_rnd_email()) |
+--------------------------+
| binary                   |
+--------------------------+

いずれのバージョンでも、文字列の戻り値を別の文字セットにする必要がある場合は、変換します。 次の例は、gen_rnd_email() の結果を utf8mb4 文字セットに変換する方法を示しています:

SET @email = CONVERT(gen_rnd_email() USING utf8mb4);

顧客識別のためのマスクされたデータの使用 に示されているように、文字列引数の変換が必要になる場合もあります。

データマスキング関数

このセクションの各関数は、文字列引数に対してマスキング操作を実行し、マスキングされた結果を返します。

  • mask_inner(str, margin1, margin2 [, mask_char])

    文字列の内部部分をマスクし、末尾はそのままにして、結果を返します。 オプションのマスキング文字を指定できます。

    引数:

    • str: マスクする文字列。

    • margin1: マスクされないままにする文字列の左端の文字数を指定する負でない整数。 値が 0 の場合、左の終了文字はマスクされません。

    • margin2: マスクされないままにする文字列の右端の文字数を指定する負でない整数。 値が 0 の場合、右側の終了文字はマスクされません。

    • mask_char: (オプション) マスキングに使用する単一の文字。 mask_char が指定されていない場合、デフォルトは'X'です。

      マスキング文字はシングルバイト文字である必要があります。 マルチバイト文字を使用しようとすると、エラーが発生します。

    戻り値:

    マスクされた文字列。いずれかのマージンが負の場合は NULL

    マージン値の合計が引数の長さより大きい場合、マスキングは行われず、引数は変更されずに返されます。

    例:

    mysql> SELECT mask_inner('abcdef', 1, 2), mask_inner('abcdef',0, 5);
    +----------------------------+---------------------------+
    | mask_inner('abcdef', 1, 2) | mask_inner('abcdef',0, 5) |
    +----------------------------+---------------------------+
    | aXXXef                     | Xbcdef                    |
    +----------------------------+---------------------------+
    mysql> SELECT mask_inner('abcdef', 1, 2, '*'), mask_inner('abcdef',0, 5, '#');
    +---------------------------------+--------------------------------+
    | mask_inner('abcdef', 1, 2, '*') | mask_inner('abcdef',0, 5, '#') |
    +---------------------------------+--------------------------------+
    | a***ef                          | #bcdef                         |
    +---------------------------------+--------------------------------+
  • mask_outer(str, margin1, margin2 [, mask_char])

    文字列の左端と右端をマスクし、内部をマスクしないままにして、結果を返します。 オプションのマスキング文字を指定できます。

    引数:

    • str: マスクする文字列。

    • margin1: マスクする文字列の左端の文字数を指定する負でない整数。 値が 0 の場合、左端の文字はマスクされません。

    • margin2: マスクする文字列の右端の文字数を指定する負でない整数。 値が 0 の場合、右端の文字はマスクされません。

    • mask_char: (オプション) マスキングに使用する単一の文字。 mask_char が指定されていない場合、デフォルトは'X'です。

      マスキング文字はシングルバイト文字である必要があります。 マルチバイト文字を使用しようとすると、エラーが発生します。

    戻り値:

    マスクされた文字列。いずれかのマージンが負の場合は NULL

    マージン値の合計が引数の長さより大きい場合、引数全体がマスクされます。

    例:

    mysql> SELECT mask_outer('abcdef', 1, 2), mask_outer('abcdef',0, 5);
    +----------------------------+---------------------------+
    | mask_outer('abcdef', 1, 2) | mask_outer('abcdef',0, 5) |
    +----------------------------+---------------------------+
    | XbcdXX                     | aXXXXX                    |
    +----------------------------+---------------------------+
    mysql> SELECT mask_outer('abcdef', 1, 2, '*'), mask_outer('abcdef',0, 5, '#');
    +---------------------------------+--------------------------------+
    | mask_outer('abcdef', 1, 2, '*') | mask_outer('abcdef',0, 5, '#') |
    +---------------------------------+--------------------------------+
    | *bcd**                          | a#####                         |
    +---------------------------------+--------------------------------+
  • mask_pan(str)

    支払カードプライマリアカウント番号をマスクし、最後の 4 桁を除くすべての数字を'X'文字に置き換えて返します。

    引数:

    • str: マスクする文字列。 文字列はプライマリアカウント番号に適した長さである必要がありますが、それ以外の場合は選択されません。

    戻り値:

    マスクされた支払番号を文字列として指定します。 引数が必須より短い場合は、変更されずに返されます。

    例:

    mysql> SELECT mask_pan(gen_rnd_pan());
    +-------------------------+
    | mask_pan(gen_rnd_pan()) |
    +-------------------------+
    | XXXXXXXXXXXX9102        |
    +-------------------------+
    mysql> SELECT mask_pan(gen_rnd_pan(19));
    +---------------------------+
    | mask_pan(gen_rnd_pan(19)) |
    +---------------------------+
    | XXXXXXXXXXXXXXX8268       |
    +---------------------------+
    mysql> SELECT mask_pan('a*Z');
    +-----------------+
    | mask_pan('a*Z') |
    +-----------------+
    | a*Z             |
    +-----------------+
  • mask_pan_relaxed(str)

    支払カードプライマリアカウント番号をマスクし、最初の 6 桁と最後の 4 桁を除くすべての数字を'X'文字に置き換えて返します。 最初の 6 桁は、支払カード会社を示します。

    引数:

    • str: マスクする文字列。 文字列はプライマリアカウント番号に適した長さである必要がありますが、それ以外の場合は選択されません。

    戻り値:

    マスクされた支払番号を文字列として指定します。 引数が必須より短い場合は、変更されずに返されます。

    例:

    mysql> SELECT mask_pan_relaxed(gen_rnd_pan());
    +---------------------------------+
    | mask_pan_relaxed(gen_rnd_pan()) |
    +---------------------------------+
    | 551279XXXXXX3108                |
    +---------------------------------+
    mysql> SELECT mask_pan_relaxed(gen_rnd_pan(19));
    +-----------------------------------+
    | mask_pan_relaxed(gen_rnd_pan(19)) |
    +-----------------------------------+
    | 462634XXXXXXXXX6739               |
    +-----------------------------------+
    mysql> SELECT mask_pan_relaxed('a*Z');
    +-------------------------+
    | mask_pan_relaxed('a*Z') |
    +-------------------------+
    | a*Z                     |
    +-------------------------+
  • mask_ssn(str)

    米国社会保障番号をマスクし、最後の 4 桁を除くすべての数字を'X'文字に置き換えて返します。

    引数:

    • str: マスクする文字列。 文字列の長さは 11 文字である必要がありますが、それ以外の場合はチェックされません。

    戻り値:

    マスクされた社会保障番号 (文字列)。引数の長さが正しくない場合は NULL

    例:

    mysql> SELECT mask_ssn('909-63-6922'), mask_ssn('abcdefghijk');
    +-------------------------+-------------------------+
    | mask_ssn('909-63-6922') | mask_ssn('abcdefghijk') |
    +-------------------------+-------------------------+
    | XXX-XX-6922             | XXX-XX-hijk             |
    +-------------------------+-------------------------+
    mysql> SELECT mask_ssn('909');
    +-----------------+
    | mask_ssn('909') |
    +-----------------+
    | NULL            |
    +-----------------+

ランダムデータ生成関数

このセクションの関数は、様々なタイプのデータに対してランダムな値を生成します。 可能な場合、生成された値にはデモンストレーションまたはテスト値用に予約された特性があり、正当なデータを間違えないようにします。 たとえば、gen_rnd_us_phone() は 555 市外局番を使用する米国電話番号を返しますが、これは実際の使用では電話番号に割り当てられていません。 個々の関数の説明では、この原則の例外について説明します。

  • gen_range(lower, upper)

    指定された範囲から選択された乱数を生成します。

    引数:

    • lower: 範囲の下限を指定する整数。

    • upper: 範囲の上限を指定する整数。下限より小さくすることはできません。

    戻り値:

    lower から upper までの範囲のランダムな整数 (upper 引数が lower より小さい場合は NULL)。

    例:

    mysql> SELECT gen_range(100, 200), gen_range(-1000, -800);
    +---------------------+------------------------+
    | gen_range(100, 200) | gen_range(-1000, -800) |
    +---------------------+------------------------+
    |                 177 |                   -917 |
    +---------------------+------------------------+
    mysql> SELECT gen_range(1, 0);
    +-----------------+
    | gen_range(1, 0) |
    +-----------------+
    |            NULL |
    +-----------------+
  • gen_rnd_email()

    example.com ドメインにランダムな電子メールアドレスを生成します。

    引数:

    なし

    戻り値:

    文字列としてのランダムな電子メールアドレス。

    例:

    mysql> SELECT gen_rnd_email();
    +---------------------------+
    | gen_rnd_email()           |
    +---------------------------+
    | ijocv.mwvhhuf@example.com |
    +---------------------------+
  • gen_rnd_pan([size])

    ランダム支払カードプライマリアカウント番号を生成します。 数値は Luhn チェック (検証桁に対してチェックサム検証を実行するアルゴリズム) に合格します。

    警告

    gen_rnd_pan() から返される値はテスト目的でのみ使用する必要があり、公開には適していません。 特定の戻り値が正当な支払アカウントに割り当てられていないことを保証する方法はありません。 gen_rnd_pan() の結果を公開する必要がある場合は、mask_pan() または mask_pan_relaxed() でマスキングすることを検討してください。

    引数:

    • size: (オプション) 結果のサイズを指定する整数。 size が指定されていない場合、デフォルトは 16 です。 指定する場合、size は 12 から 19 の範囲の整数である必要があります。

    戻り値:

    文字列としてのランダムな支払番号。許可された範囲外の size 引数が指定されている場合は NULL

    例:

    mysql> SELECT mask_pan(gen_rnd_pan());
    +-------------------------+
    | mask_pan(gen_rnd_pan()) |
    +-------------------------+
    | XXXXXXXXXXXX5805        |
    +-------------------------+
    mysql> SELECT mask_pan(gen_rnd_pan(19));
    +---------------------------+
    | mask_pan(gen_rnd_pan(19)) |
    +---------------------------+
    | XXXXXXXXXXXXXXX5067       |
    +---------------------------+
    mysql> SELECT mask_pan_relaxed(gen_rnd_pan());
    +---------------------------------+
    | mask_pan_relaxed(gen_rnd_pan()) |
    +---------------------------------+
    | 398403XXXXXX9547                |
    +---------------------------------+
    mysql> SELECT mask_pan_relaxed(gen_rnd_pan(19));
    +-----------------------------------+
    | mask_pan_relaxed(gen_rnd_pan(19)) |
    +-----------------------------------+
    | 578416XXXXXXXXX6509               |
    +-----------------------------------+
    mysql> SELECT gen_rnd_pan(11), gen_rnd_pan(20);
    +-----------------+-----------------+
    | gen_rnd_pan(11) | gen_rnd_pan(20) |
    +-----------------+-----------------+
    | NULL            | NULL            |
    +-----------------+-----------------+
  • gen_rnd_ssn()

    ランダムな US 社会保障番号を AAA-BB-CCCC 形式で生成します。 AAA 部分が 900 を超え、BB 部分が 70 未満です。これは、正当な社会保障番号に使用されない特性です。

    引数:

    なし

    戻り値:

    文字列としてのランダムな社会保障番号。

    例:

    mysql> SELECT gen_rnd_ssn();
    +---------------+
    | gen_rnd_ssn() |
    +---------------+
    | 951-26-0058   |
    +---------------+
  • gen_rnd_us_phone()

    ランダムな米国電話番号を 1-555-AAA-BBBB 形式で生成します。 555 市外局番は正当な電話番号には使用されません。

    引数:

    なし

    戻り値:

    文字列としてのランダムな US 電話番号。

    例:

    mysql> SELECT gen_rnd_us_phone();
    +--------------------+
    | gen_rnd_us_phone() |
    +--------------------+
    | 1-555-682-5423     |
    +--------------------+

ランダムデータディクショナリビューの関数

このセクションの関数は、用語のディクショナリを操作し、それらに基づいて生成およびマスキング操作を実行します。 これらの関数の中には、SUPER 権限を必要とするものがあります。

ディクショナリがロードされると、ディクショナリレジストリの一部になり、他のディクショナリ関数で使用される名前が割り当てられます。 ディクショナリは、行ごとに 1 語を含むプレーンテキストファイルからロードされます。 空の行は無視されます。 有効にするには、辞書ファイルに空でない行が少なくとも 1 つ含まれている必要があります。

  • gen_blacklist(str, dictionary_name, replacement_dictionary_name)

    1 つの辞書に存在する用語を 2 つ目の辞書の用語に置き換え、置換する用語を返します。 これは、置換によって元の用語をマスクします。 この関数は MySQL 8.0.23 では非推奨です。かわりに gen_blocklist() を使用してください。

  • gen_blocklist(str, dictionary_name, replacement_dictionary_name)

    1 つの辞書に存在する用語を 2 つ目の辞書の用語に置き換え、置換する用語を返します。 これは、置換によって元の用語をマスクします。 この関数は MySQL 8.0.23 で追加されました。gen_blacklist() のかわりに使用してください。

    引数:

    • str: 置換する用語を示す文字列。

    • dictionary_name: 置換する用語を含むディクショナリを指定する文字列。

    • replacement_dictionary_name: 置換語を選択するディクショナリを指定する文字列。

    戻り値:

    str の代替として replacement_dictionary_name からランダムに選択された文字列。dictionary_name に表示されない場合は str、いずれかのディクショナリ名がディクショナリレジストリにない場合は NULL

    置換する用語が両方のディクショナリにある場合は、戻り値が同じ用語である可能性があります。

    例:

    mysql> SELECT gen_blocklist('Berlin', 'DE_Cities', 'US_Cities');
    +---------------------------------------------------+
    | gen_blocklist('Berlin', 'DE_Cities', 'US_Cities') |
    +---------------------------------------------------+
    | Phoenix                                           |
    +---------------------------------------------------+
  • gen_dictionary(dictionary_name)

    ディクショナリからランダムな用語を返します。

    引数:

    • dictionary_name: 用語を選択するディクショナリを指定する文字列。

    戻り値:

    ディクショナリからの文字列としてのランダムな用語。ディクショナリ名がディクショナリレジストリにない場合は NULL

    例:

    mysql> SELECT gen_dictionary('mydict');
    +--------------------------+
    | gen_dictionary('mydict') |
    +--------------------------+
    | My term                  |
    +--------------------------+
    mysql> SELECT gen_dictionary('no-such-dict');
    +--------------------------------+
    | gen_dictionary('no-such-dict') |
    +--------------------------------+
    | NULL                           |
    +--------------------------------+
  • gen_dictionary_drop(dictionary_name)

    ディクショナリレジストリからディクショナリを削除します。

    この関数には、SUPER 権限が必要です。

    引数:

    • dictionary_name: ディクショナリレジストリから削除するディクショナリを指定する文字列。

    戻り値:

    削除操作が成功したかどうかを示す文字列。 Dictionary removed は成功を示します。 Dictionary removal error は失敗を示します。

    例:

    mysql> SELECT gen_dictionary_drop('mydict');
    +-------------------------------+
    | gen_dictionary_drop('mydict') |
    +-------------------------------+
    | Dictionary removed            |
    +-------------------------------+
    mysql> SELECT gen_dictionary_drop('no-such-dict');
    +-------------------------------------+
    | gen_dictionary_drop('no-such-dict') |
    +-------------------------------------+
    | Dictionary removal error            |
    +-------------------------------------+
  • gen_dictionary_load(dictionary_path, dictionary_name)

    ファイルをディクショナリレジストリにロードし、ディクショナリ名引数を必要とする他の関数で使用される名前をディクショナリに割り当てます。

    この関数には、SUPER 権限が必要です。

    重要

    ディクショナリは永続的ではありません。 アプリケーションで使用されるディクショナリは、サーバーの起動ごとにロードする必要があります。

    レジストリにロードされたディクショナリは、基礎となるディクショナリファイルが変更された場合でもそのまま使用されます。 ディクショナリをリロードするには、まず gen_dictionary_drop() でディクショナリを削除してから、gen_dictionary_load() で再度ロードします。

    引数:

    • dictionary_path: ディクショナリファイルのパス名を指定する文字列。

    • dictionary_name: ディクショナリの名前を示す文字列。

    戻り値:

    ロード操作が成功したかどうかを示す文字列。 Dictionary load success は成功を示します。 Dictionary load error は失敗を示します。 ディクショナリロードの失敗は、次のようないくつかの理由で発生します:

    • 指定された名前のディクショナリはすでにロードされています。

    • ディクショナリファイルが見つかりません。

    • 辞書ファイルに用語が含まれていません。

    • secure_file_priv システム変数が設定されており、ディクショナリファイルが変数で指定されたディレクトリにありません。

    例:

    mysql> SELECT gen_dictionary_load('/usr/local/mysql/mysql-files/mydict','mydict');
    +---------------------------------------------------------------------+
    | gen_dictionary_load('/usr/local/mysql/mysql-files/mydict','mydict') |
    +---------------------------------------------------------------------+
    | Dictionary load success                                             |
    +---------------------------------------------------------------------+
    mysql> SELECT gen_dictionary_load('/dev/null','null');
    +-----------------------------------------+
    | gen_dictionary_load('/dev/null','null') |
    +-----------------------------------------+
    | Dictionary load error                   |
    +-----------------------------------------+

関連キーワード:  gen, pan, rnd, マスク, 関数, ディクショナリ, 文字, 用語, abcdef, 認証