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##### | +---------------------------------+--------------------------------+
遮蔽付款卡主要帳號號碼,並傳回除了最後四位數字外,其餘數字都以
'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 | +-----------------+
遮蔽付款卡主要帳號號碼,並傳回除了前六位和最後四位數字外,其餘數字都以
'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 | +-------------------------+
遮蔽美國社會安全號碼,並傳回除了最後四位數字外,其餘數字都以
'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 區碼的美國電話號碼,該區碼並未分配給實際使用的電話號碼。個別的函數說明會描述此原則的任何例外情況。
產生從指定範圍中選取的隨機數字。
引數
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 | +-----------------+
產生一個
example.com
網域中的隨機電子郵件地址。引數
無。
傳回值
以字串形式傳回的隨機電子郵件地址。
範例
mysql> SELECT gen_rnd_email(); +---------------------------+ | gen_rnd_email() | +---------------------------+ | ijocv.mwvhhuf@example.com | +---------------------------+
產生一個隨機的付款卡主要帳號號碼。該號碼會通過 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 | +-----------------+-----------------+
產生
格式的隨機美國社會安全號碼。AAA
-BB
-CCCC
AAA
部分大於 900,而BB
部分小於 70,這些都是合法社會安全號碼不會使用的特徵。引數
無。
傳回值
以字串形式傳回的隨機社會安全號碼。
範例
mysql> SELECT gen_rnd_ssn(); +---------------+ | gen_rnd_ssn() | +---------------+ | 951-26-0058 | +---------------+
產生
1-555-
格式的隨機美國電話號碼。555 區碼不適用於合法的電話號碼。AAA
-BBBB
引數
無。
傳回值
以字串形式傳回的隨機美國電話號碼。
範例
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 | +-----------------------------------------+