文档主页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  MySQL 企业版数据屏蔽和去标识插件函数描述

8.5.3.4 MySQL 企业版数据屏蔽和去标识插件函数描述

MySQL 企业版数据屏蔽和去标识插件库包含多个函数,这些函数可以分为以下类别

这些函数支持字符串参数和返回值的单字节 latin1 字符集。如果字符串返回值应该使用不同的字符集,请进行转换。以下示例展示了如何将 gen_rnd_email() 的结果转换为 utf8mb4 字符集

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

也可能需要转换字符串参数,如 使用屏蔽数据进行客户身份验证 中所示。

如果从 mysql 客户端内调用 MySQL 企业版数据屏蔽和去标识函数,则二进制字符串结果将使用十六进制表示法显示,具体取决于 --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()           |
    +---------------------------+
    | [email protected] |
    +---------------------------+
  • 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 的替换,或者如果它未出现在 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                   |
    +-----------------------------------------+