文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  MySQL Enterprise 資料遮罩與去識別化外掛程式函式說明

8.5.3.4 MySQL Enterprise 資料遮罩與去識別化外掛程式函式說明

MySQL Enterprise 資料遮罩與去識別化外掛程式函式庫包含數個函式,可以歸類為以下類別

這些函式支援單一位元組 latin1 字元集,用於字串引數與傳回值。如果字串傳回值應採用不同的字元集,請轉換它。以下範例示範如何將 gen_rnd_email() 的結果轉換為 utf8mb4 字元集

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

也可能需要轉換字串引數,如使用遮罩資料進行客戶識別中所述。

如果在 mysql 用戶端內呼叫 MySQL Enterprise Data Masking and De-Identification 函式,二進位字串結果會使用十六進位表示法顯示,具體取決於 --binary-as-hex 的值。有關該選項的更多資訊,請參閱第 6.5.1 節,「mysql — MySQL 命令列用戶端」

資料遮罩外掛程式函式

本節中的每個外掛程式函式都會對其字串引數執行遮罩作業,並傳回遮罩後的結果。

  • 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)

    遮罩付款卡主帳號,並傳回除了最後四位數之外的所有數字都由 '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)

    遮罩付款卡主帳號,並傳回除了前六位數和最後四位數之外的所有數字都由 'X' 字元取代的號碼。前六位數表示付款卡發卡行。

    引數

    • 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)

    遮罩美國社會安全號碼,並傳回除了最後四位數之外的所有數字都由 'X' 字元取代的號碼。

    引數

    • str:要遮罩的字串。該字串長度必須為 11 個字元。

    傳回值

    遮罩後的社會安全號碼(以字串形式),如果引數長度不正確,則傳回錯誤。

    範例

    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');
    ERROR 1123 (HY000): Can't initialize function 'mask_ssn'; MASK_SSN: Error:
    String argument width too small
    mysql> SELECT mask_ssn('123456789123456789');
    ERROR 1123 (HY000): Can't initialize function 'mask_ssn'; MASK_SSN: Error:
    String argument width too large
隨機資料產生外掛程式函式

本節中的外掛程式函式會為不同類型的資料產生隨機值。在可能的情況下,產生的值具有保留給示範或測試值的特徵,以避免將其誤認為合法資料。例如,gen_rnd_us_phone() 會傳回使用 555 區碼的美國電話號碼,該區碼未分配給實際使用的電話號碼。個別函式說明會描述此原則的任何例外情況。

  • gen_range(lower, upper)

    產生從指定範圍中選取的隨機數字。

    引數

    • lower:一個整數,指定範圍的下限。

    • upper:一個整數,指定範圍的上限,其值不得小於下限。

    傳回值

    範圍從 lowerupper(含)的隨機整數,如果 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,則 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()

    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 區碼不適用於合法的電話號碼。

    引數

    無。

    傳回值

    隨機美國電話號碼(以字串形式)。

    範例

    mysql> SELECT gen_rnd_us_phone();
    +--------------------+
    | gen_rnd_us_phone() |
    +--------------------+
    | 1-555-682-5423     |
    +--------------------+
隨機資料字典型外掛程式函式

本節中的外掛程式函式會操作術語字典,並根據它們執行產生和遮罩作業。其中一些函式需要 SUPER 權限。

載入字典後,它會成為字典登錄的一部分,並獲分配一個名稱,供其他字典函式使用。字典是從純文字檔案載入的,每個檔案每行包含一個術語。會忽略空行。若要有效,字典檔案必須至少包含一個非空行。

  • gen_blacklist(str, dictionary_name, replacement_dictionary_name)

    將一個字典中存在的術語替換為第二個字典中的術語,並傳回替換術語。這會通過替換來遮罩原始術語。此函式已過時;請改用 gen_blocklist()

  • gen_blocklist(str, dictionary_name, replacement_dictionary_name)

    將一個字典中存在的術語替換為第二個字典中的術語,並傳回替換術語。這會通過替換來遮罩原始術語。此函式可替代已過時的 gen_blacklist() 函式。

    引數

    • str:一個字串,指示要替換的術語。

    • dictionary_name:一個字串,命名包含要替換的術語的字典。

    • replacement_dictionary_name:一個字串,命名要從中選擇替換術語的字典。

    傳回值

    replacement_dictionary_name 中隨機選取的一個字串,作為 str 的替換項,如果 str 未出現在 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                   |
    +-----------------------------------------+