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


MySQL 8.4 參考手冊  /  ...  /  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 資料遮罩與去識別函數,二進位字串結果會使用十六進位表示法顯示,視 --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 必須是 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                   |
    +-----------------------------------------+