家居小楠人≈

您现在的位置是:首页 > 慢生活 > 程序人生网站首页慢生活

MySql ip地址与数值之间转换及其他函数

家居小楠人≈ 2019-04-16 472人围观
简介 自己收集的文章,学习之用!!!
名称描述
ANY_VALUE()
抑制ONLY_FULL_GROUP_BY值拒绝
BIN_TO_UUID()将二进制UUID转换为字符串
DEFAULT()
返回表列的默认值
GROUPING()区分超级聚合ROLLUP行与常规行
INET_ATON()
返回IP地址的数值
INET_NTOA()
从数值返回IP地址
INET6_ATON()
返回IPv6地址的数值
INET6_NTOA()
从数值返回IPv6地址
IS_IPV4()
参数是否为IPv4地址
IS_IPV4_COMPAT()
参数是否是IPv4兼容的地址
IS_IPV4_MAPPED()
参数是否是IPv4映射地址
IS_IPV6()参数是否是IPv6地址
IS_UUID()
参数是否是有效的UUID
MASTER_POS_WAIT()
阻止,直到从站已读取并应用所有更新到指定位置
NAME_CONST()
导致列具有给定名称
RAND()
返回随机浮点值
SLEEP()
睡几秒钟
UUID()
返回通用唯一标识符(UUID)
UUID_SHORT()
返回整数值通用标识符
UUID_TO_BIN()
将字符串UUID转换为二进制
VALUES()
定义INSERT期间要使用的值



  • ANY_VALUE(arg)

    对于启用SQL模式的GROUP BY 查询, 此函数非常有用ONLY_FULL_GROUP_BY,因为MySQL会拒绝您知道由于MySQL无法确定的原因而有效的查询。函数返回值和类型与其参数的返回值和类型相同,但不检查ONLY_FULL_GROUP_BY SQL模式的函数结果。

    例如,如果name是非索引列,则以下查询将失败并 ONLY_FULL_GROUP_BY启用:

    mysql> SELECT name, address, MAX(age) FROM t GROUP BY name;
    ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
    BY clause and contains nonaggregated column 'mydb.t.address' which
    is not functionally dependent on columns in GROUP BY clause; this
    is incompatible with sql_mode=only_full_group_by

    发生故障是因为address非聚合列既不在GROUP BY列中命名, 也不在功能上依赖于它们。因此,address每个name组中的行的值是不确定的。有多种方法可以使MySQL接受查询:

    • 更改表以创建name主键或唯一NOT NULL列。这使MySQL能够确定address 在功能上依赖于name; 也就是说,address由唯一确定 name。(如果NULL必须允许此技术作为有效值, 则此技术不适用name。)

    • 使用ANY_VALUE()是指 address

      SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

      在这种情况下,MySQL忽略address每个name组中值 的不确定性 并接受查询。如果您根本不关心为每个组选择哪个非聚合列的值,这可能很有用。 ANY_VALUE()不是聚集函数,不像功能,例如 SUM()或 COUNT()。它只是用来抑制非确定性的测试。

    • 禁用 ONLY_FULL_GROUP_BY。这相当于使用 ANY_VALUE()with ONLY_FULL_GROUP_BY enabled,如上一项所述。

    ANY_VALUE()如果列之间存在函数依赖,但MySQL无法确定它,这也很有用。以下查询是有效的,因为 age它在功能上依赖于分组列age-1,但MySQL不能告诉它并拒绝ONLY_FULL_GROUP_BY启用的查询 :

    SELECT age FROM t GROUP BY age-1;

    要使MySQL接受查询,请使用 ANY_VALUE()

    SELECT ANY_VALUE(age) FROM t GROUP BY age-1;

    ANY_VALUE()可以用于在没有GROUP BY子句的情况下引用聚合函数的查询 :

    mysql> SELECT name, MAX(age) FROM t;
    ERROR 1140 (42000): In aggregated query without GROUP BY, expression
    #1 of SELECT list contains nonaggregated column 'mydb.t.name'; this
    is incompatible with sql_mode=only_full_group_by

    没有GROUP BY,只有一个组,它是不确定的,name为组选择值。 ANY_VALUE()告诉MySQL接受查询:

    SELECT ANY_VALUE(name), MAX(age) FROM t;

    可能是由于给定数据集的某些属性,您知道所选的非聚合列在功能上有效地依赖于GROUP BY 列。例如,应用程序可以强制一列相对于另一列的唯一性。在这种情况下,使用ANY_VALUE()有效的功能依赖列可能是有意义的。

    有关其他讨论,请参见 第12.20.3节“GROUP BY的MySQL处理”

  • BIN_TO_UUID(binary_uuid), BIN_TO_UUID(binary_uuidswap_flag)

    BIN_TO_UUID()是反的 UUID_TO_BIN()。它将二进制UUID转换为字符串UUID并返回结果。二进制值应该是UUID作为 VARBINARY(16)值。返回值是utf8由破折号分隔的五个十六进制数字的字符串。(有关此格式的详细信息,请参阅UUID()函数说明。)如果UUID参数为NULL,则返回值为NULL。如果任何参数无效,则会发生错误。

    BIN_TO_UUID() 需要一个或两个参数:

    • 单参数形式采用二进制UUID值。假设UUID值没有交换时间低和时间高的部分。字符串结果与二进制参数的顺序相同。

    • 双参数形式采用二进制UUID值和swap-flag值:

      • 如果swap_flag为0,则双参数形式等效于单参数形式。字符串结果与二进制参数的顺序相同。

      • 如果swap_flag为1,则假定UUID值具有交换的时间低和时间高的部分。这些部件将交换回结果值中的原始位置。

    有关时间 - 部分交换的用法示例和信息,请参阅UUID_TO_BIN()功能说明。

  • DEFAULT(col_name)

    返回表列的默认值。如果列没有默认值,则会出现错误。

    仅允许具有文字默认值的列 使用 指定命名列的默认值,而不允许使用具有表达式默认值的列。 DEFAULT(col_name)

    mysql> UPDATE t SET i = DEFAULT(i)+1 WHERE id < 100;
  • FORMAT(X,D)

    将数字格式化X为格式'#,###,###.##',舍入到 D小数位,并将结果作为字符串返回。有关详细信息,请参见 第12.5节“字符串函数”

  • GROUPING(expr [, expr] ...)

    对于GROUP BY包含WITH ROLLUP修饰符的查询 ,该 ROLLUP操作会生成超级聚合输出行,其中NULL表示所有值的集合。该GROUPING() 功能使您可以区分NULL 超级聚合行的NULL 值与常规分组行中的值。

    GROUPING()只允许在选择列表或HAVING子句中使用。

    每个参数GROUPING() 必须是与GROUP BY子句中的表达式完全匹配的表达式。表达式不能是位置说明符。对于每个表达式,GROUPING()如果当前行中的表达式值NULL表示超级聚合值,则 生成1 。否则,GROUPING()生成0,表示表达式值是 NULL常规结果行的a或不是 NULL

    假设该表t1包含这些行,其中NULL表示 “ other ”或“ unknown ”之类的内容:

    mysql> SELECT * FROM t1;
    +------+-------+----------+
    | name | size  | quantity |
    +------+-------+----------+
    | ball | small |       10 |
    | ball | large |       20 |
    | ball | NULL  |        5 |
    | hoop | small |       15 |
    | hoop | large |        5 |
    | hoop | NULL  |        3 |
    +------+-------+----------+

    表的摘要不是WITH ROLLUP 这样的:

    mysql> SELECT name, size, SUM(quantity) AS quantity
           FROM t1
           GROUP BY name, size;
    +------+-------+----------+
    | name | size  | quantity |
    +------+-------+----------+
    | ball | small |       10 |
    | ball | large |       20 |
    | ball | NULL  |        5 |
    | hoop | small |       15 |
    | hoop | large |        5 |
    | hoop | NULL  |        3 |
    +------+-------+----------+

    结果包含NULL值,但这些值不代表超级聚合行,因为查询不包含WITH ROLLUP

    添加WITH ROLLUP会生成包含其他NULL 值的超级聚合摘要行。但是,如果不将此结果与前一个结果进行比较,则很难看出哪些NULL 值出现在超级聚合行中,哪些值出现在常规分组行中:

    mysql> SELECT name, size, SUM(quantity) AS quantity
           FROM t1
           GROUP BY name, size WITH ROLLUP;
    +------+-------+----------+
    | name | size  | quantity |
    +------+-------+----------+
    | ball | NULL  |        5 |
    | ball | large |       20 |
    | ball | small |       10 |
    | ball | NULL  |       35 |
    | hoop | NULL  |        3 |
    | hoop | large |        5 |
    | hoop | small |       15 |
    | hoop | NULL  |       23 |
    | NULL | NULL  |       58 |
    +------+-------+----------+

    要区分NULL超级聚合行中的值与常规分组行中的值,请使用 GROUPING(),仅对超级聚合NULL值返回1 :

    mysql> SELECT
             name, size, SUM(quantity) AS quantity,
             GROUPING(name) AS grp_name,
             GROUPING(size) AS grp_size
           FROM t1
           GROUP BY name, size WITH ROLLUP;
    +------+-------+----------+----------+----------+
    | name | size  | quantity | grp_name | grp_size |
    +------+-------+----------+----------+----------+
    | ball | NULL  |        5 |        0 |        0 |
    | ball | large |       20 |        0 |        0 |
    | ball | small |       10 |        0 |        0 |
    | ball | NULL  |       35 |        0 |        1 |
    | hoop | NULL  |        3 |        0 |        0 |
    | hoop | large |        5 |        0 |        0 |
    | hoop | small |       15 |        0 |        0 |
    | hoop | NULL  |       23 |        0 |        1 |
    | NULL | NULL  |       58 |        1 |        1 |
    +------+-------+----------+----------+----------+

    常用用途GROUPING()

    • 用标签替换超级聚合 NULL值:

      mysql> SELECT
               IF(GROUPING(name) = 1, 'All items', name) AS name,
               IF(GROUPING(size) = 1, 'All sizes', size) AS size,
               SUM(quantity) AS quantity
             FROM t1
             GROUP BY name, size WITH ROLLUP;
      +-----------+-----------+----------+
      | name      | size      | quantity |
      +-----------+-----------+----------+
      | ball      | NULL      |        5 |
      | ball      | large     |       20 |
      | ball      | small     |       10 |
      | ball      | All sizes |       35 |
      | hoop      | NULL      |        3 |
      | hoop      | large     |        5 |
      | hoop      | small     |       15 |
      | hoop      | All sizes |       23 |
      | All items | All sizes |       58 |
      +-----------+-----------+----------+
    • 通过过滤掉常规的分组行,仅返回超级聚合行:

      mysql> SELECT name, size, SUM(quantity) AS quantity
             FROM t1
             GROUP BY name, size WITH ROLLUP
             HAVING GROUPING(name) = 1 OR GROUPING(size) = 1;
      +------+------+----------+
      | name | size | quantity |
      +------+------+----------+
      | ball | NULL |       35 |
      | hoop | NULL |       23 |
      | NULL | NULL |       58 |
      +------+------+----------+

    GROUPING()允许多个表达式参数。在这种情况下, GROUPING()返回值表示从每个表达式的结果组合的位掩码,其中最低位对应于最右侧表达式的结果。例如,使用三个表达式参数, 就像这样计算: GROUPING(expr1expr2expr3)

      result for GROUPING(expr3)
    + result for GROUPING(expr2) << 1
    + result for GROUPING(expr1) << 2

    以下查询显示GROUPING()单个参数的结果如何 组合以进行多参数调用以生成位掩码值:

    mysql> SELECT
             name, size, SUM(quantity) AS quantity,
             GROUPING(name) AS grp_name,
             GROUPING(size) AS grp_size,
           GROUPING(name, size) AS grp_all
           FROM t1
           GROUP BY name, size WITH ROLLUP;
    +------+-------+----------+----------+----------+---------+
    | name | size  | quantity | grp_name | grp_size | grp_all |
    +------+-------+----------+----------+----------+---------+
    | ball | NULL  |        5 |        0 |        0 |       0 |
    | ball | large |       20 |        0 |        0 |       0 |
    | ball | small |       10 |        0 |        0 |       0 |
    | ball | NULL  |       35 |        0 |        1 |       1 |
    | hoop | NULL  |        3 |        0 |        0 |       0 |
    | hoop | large |        5 |        0 |        0 |       0 |
    | hoop | small |       15 |        0 |        0 |       0 |
    | hoop | NULL  |       23 |        0 |        1 |       1 |
    | NULL | NULL  |       58 |        1 |        1 |       3 |
    +------+-------+----------+----------+----------+---------+

    对于多个表达式参数,GROUPING()如果任何表达式表示超级聚合值,则 返回值为非零。GROUPING() 因此,通过使用单个多参数GROUPING() 调用而不是多个单参数调用,多参数语法提供了一种更简单的方法来编写仅返回超级聚合行的早期查询:

    mysql> SELECT name, size, SUM(quantity) AS quantity
           FROM t1
           GROUP BY name, size WITH ROLLUP
           HAVING GROUPING(name, size) <> 0;
    +------+------+----------+
    | name | size | quantity |
    +------+------+----------+
    | ball | NULL |       35 |
    | hoop | NULL |       23 |
    | NULL | NULL |       58 |
    +------+------+----------+

    使用GROUPING()受以下限制:

    • 不要将子查询GROUP BY 表达式用作GROUPING() 参数,因为匹配可能会失败。例如,此查询的匹配失败:

      mysql> SELECT GROUPING((SELECT MAX(name) FROM t1))
             FROM t1
             GROUP BY (SELECT MAX(name) FROM t1) WITH ROLLUP;
      ERROR 3580 (HY000): Argument #1 of GROUPING function is not in GROUP BY
    • GROUP BY文字表达式不应该在HAVING子句中用作 GROUPING()参数。由于当优化评估之间的差异 GROUP BYHAVING,匹配可能会成功,但 GROUPING()评价不会产生预期的结果。考虑这个查询:

      SELECT a AS f1, 'w' AS f2
      FROM t
      GROUP BY f1, f2 WITH ROLLUP
      HAVING GROUPING(f2) = 1;

      GROUPING()对于文字常量表达式的评估比对整个HAVING子句的评估更早 并返回0.要检查此类查询是否受到影响,EXPLAINImpossible having在 Extra列中使用 并查找 。

    有关详细信息WITH ROLLUP,并 GROUPING()请参阅 第12.20.2,“GROUP BY修改”

  • INET_ATON(expr)

    给定IPv4网络地址的虚线四边形表示为字符串,返回一个整数,表示网络字节顺序(大端)的地址的数值。如果它不理解它的参数,则INET_ATON()返回 NULL

    mysql> SELECT INET_ATON('10.0.5.9');
            -> 167773449

    对于此示例,返回值计算为10×256 3 + 0×256 2 + 5×256 + 9。

    INET_ATON()可能会也可能不会返回NULL短格式IP地址的非结果(例如'127.1'表示'127.0.0.1')。因此,INET_ATON()不应将a用于此类地址。

    注意

    要存储生成的值 INET_ATON(),请使用 INT UNSIGNED列而不是 INT签名。如果使用带符号列,则无法正确存储与第一个八位字节大于127的IP地址对应的值。请参见 第11.2.6节“超出范围和溢出处理”

  • INET_NTOA(expr)

    给定网络字节顺序的数字IPv4网络地址,返回地址的点分四字符串表示形式作为连接字符集中的字符串。 如果它不理解它的参数,则INET_NTOA()返回 NULL

    mysql> SELECT INET_NTOA(167773449);
            -> '10.0.5.9'
  • INET6_ATON(expr)

    给定IPv6或IPv4网络地址作为字符串,返回二进制字符串,该字符串表示网络字节顺序(大端)的地址的数值。由于数字格式的IPv6地址需要的字节数多于最大的整数类型,因此此函数返回的表示形式具有以下 VARBINARY数据类型: VARBINARY(16)用于IPv6地址和VARBINARY(4)IPv4地址。如果参数不是有效地址,则 INET6_ATON()返回 NULL

    以下示例用于 HEX()INET6_ATON()可打印的形式显示 结果:

    mysql> SELECT HEX(INET6_ATON('fdfe::5a55:caff:fefa:9089'));
            -> 'FDFE0000000000005A55CAFFFEFA9089'
    mysql> SELECT HEX(INET6_ATON('10.0.5.9'));
            -> '0A000509'

    INET6_ATON()观察有效参数的几个约束。这些在下面的列表中给出以及示例。

    • 不允许使用尾随区域ID,如 fe80::3%1或 fe80::3%eth0

    • 不允许使用尾随网络掩码,如 2001:45f:3:ba::/64或 198.51.100.0/24

    • 对于表示IPv4地址的值,仅支持无类地址。有类别的地址如 198.51.1被拒绝。不允许使用尾随端口号,如 198.51.100.2:8080。不允许地址组件中的十六进制数字,如198.0xa0.1.2。不支持八进制数:198.51.010.1被视为 198.51.10.1,不是 198.51.8.1。这些IPv4约束也适用于具有IPv4地址部分的IPv6地址,例如IPv4兼容或IPv4映射地址。

    expr 将以数字形式表示的IPv4地址作为INT值转换为以数字形式表示 的IPv6地址作为 VARBINARY值,请使用以下表达式:

    INET6_ATON(INET_NTOA(expr))

    例如:

    mysql> SELECT HEX(INET6_ATON(INET_NTOA(167773449)));
            -> '0A000509'
  • INET6_NTOA(expr)

    给定以数字形式表示为二进制字符串的IPv6或IPv4网络地址,将地址的字符串表示形式返回为连接字符集中的字符串。如果参数不是有效地址,则 INET6_NTOA()返回 NULL

    INET6_NTOA() 有这些属性:

    • 它不使用操作系统函数来执行转换,因此输出字符串与平台无关。

    • 返回字符串的最大长度为39(4 x 8 + 7)。鉴于此声明:

      CREATE TABLE t AS SELECT INET6_NTOA(expr) AS c1;

      结果表将具有以下定义:

      CREATE TABLE t (c1 VARCHAR(39) CHARACTER SET utf8 DEFAULT NULL);
    • 返回字符串使用小写字母表示IPv6地址。

    mysql> SELECT INET6_NTOA(INET6_ATON('fdfe::5a55:caff:fefa:9089'));
            -> 'fdfe::5a55:caff:fefa:9089'
    mysql> SELECT INET6_NTOA(INET6_ATON('10.0.5.9'));
            -> '10.0.5.9'
    
    mysql> SELECT INET6_NTOA(UNHEX('FDFE0000000000005A55CAFFFEFA9089'));
            -> 'fdfe::5a55:caff:fefa:9089'
    mysql> SELECT INET6_NTOA(UNHEX('0A000509'));
            -> '10.0.5.9'
  • IS_IPV4(expr)

    如果参数是指定为字符串的有效IPv4地址,则返回1,否则返回0。

    mysql> SELECT IS_IPV4('10.0.5.9'), IS_IPV4('10.0.5.256');
            -> 1, 0

    对于给定的参数,如果 IS_IPV4()返回1, INET_ATON()(和 INET6_ATON())将返回非NULL。相反的陈述不正确:在某些情况下, 返回0 时 返回INET_ATON()非。NULLIS_IPV4()

    正如前面的评论所暗示的那样, IS_IPV4()INET_ATON()构成有效IPv4地址的内容更严格 ,因此对于需要对无效值执行强检查的应用程序可能很有用。或者,用于INET6_ATON()将IPv4地址转换为内部格式并检查 NULL结果(表示无效的地址)。 关于检查IPv4地址INET6_ATON()同样强大IS_IPV4()

  • IS_IPV4_COMPAT(expr)

    此函数将以数字形式表示的IPv6地址作为二进制字符串,如返回 INET6_ATON()。如果参数是有效的IPv4兼容IPv6地址,则返回1,否则返回0。IPv4兼容地址具有该形式 。::ipv4_address

    mysql> SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9'));
            -> 1
    mysql> SELECT IS_IPV4_COMPAT(INET6_ATON('::ffff:10.0.5.9'));
            -> 0

    IPv4兼容地址的IPv4部分也可以使用十六进制表示法表示。例如, 198.51.100.1具有此原始十六进制值:

    mysql> SELECT HEX(INET6_ATON('198.51.100.1'));
            -> 'C6336401'

    以IPv4兼容的形式表示, ::198.51.100.1相当于 ::c0a8:0001或(没有前导零) ::c0a8:1

    mysql> SELECT
        ->   IS_IPV4_COMPAT(INET6_ATON('::198.51.100.1')),
        ->   IS_IPV4_COMPAT(INET6_ATON('::c0a8:0001')),
        ->   IS_IPV4_COMPAT(INET6_ATON('::c0a8:1'));
            -> 1, 1, 1
  • IS_IPV4_MAPPED(expr)

    此函数将以数字形式表示的IPv6地址作为二进制字符串,如返回 INET6_ATON()。如果参数是有效的IPv4映射IPv6地址,则返回1,否则返回0。IPv4映射地址具有该形式 。::ffff:ipv4_address

    mysql> SELECT IS_IPV4_MAPPED(INET6_ATON('::10.0.5.9'));
            -> 0
    mysql> SELECT IS_IPV4_MAPPED(INET6_ATON('::ffff:10.0.5.9'));
            -> 1

    IS_IPV4_COMPAT()IPv4映射地址的IPv4部分一样,也可以使用十六进制表示法表示:

    mysql> SELECT
        ->   IS_IPV4_MAPPED(INET6_ATON('::ffff:198.51.100.1')),
        ->   IS_IPV4_MAPPED(INET6_ATON('::ffff:c0a8:0001')),
        ->   IS_IPV4_MAPPED(INET6_ATON('::ffff:c0a8:1'));
            -> 1, 1, 1
  • IS_IPV6(expr)

    如果参数是指定为字符串的有效IPv6地址,则返回1,否则返回0。此功能不会将IPv4地址视为有效的IPv6地址。

    mysql> SELECT IS_IPV6('10.0.5.9'), IS_IPV6('::1');
            -> 0, 1

    对于给定的参数,如果 IS_IPV6()返回1, INET6_ATON()则返回非NULL

  • IS_UUID(string_uuid)

    如果该参数是一个有效的字符串格式的UUID,0如果参数是不是有效的UUID,并返回1 NULL 如果该参数NULL

    “ 有效 ”表示该值采用可以解析的格式。也就是说,它具有正确的长度并且仅包含允许的字符(任何字母表中的十六进制数字,以及可选的破折号和花括号)。这种格式最常见:

    aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee

    这些其他格式也是允许的:

    aaaaaaaabbbbccccddddeeeeeeeeeeee
    {aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}

    有关值内字段的含义,请参阅 UUID()函数说明。

    mysql> SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c656024db');
    +-------------------------------------------------+
    | IS_UUID('6ccd780c-baba-1026-9564-5b8c656024db') |
    +-------------------------------------------------+
    |                                               1 |
    +-------------------------------------------------+
    mysql> SELECT IS_UUID('6CCD780C-BABA-1026-9564-5B8C656024DB');
    +-------------------------------------------------+
    | IS_UUID('6CCD780C-BABA-1026-9564-5B8C656024DB') |
    +-------------------------------------------------+
    |                                               1 |
    +-------------------------------------------------+
    mysql> SELECT IS_UUID('6ccd780cbaba102695645b8c656024db');
    +---------------------------------------------+
    | IS_UUID('6ccd780cbaba102695645b8c656024db') |
    +---------------------------------------------+
    |                                           1 |
    +---------------------------------------------+
    mysql> SELECT IS_UUID('{6ccd780c-baba-1026-9564-5b8c656024db}');
    +---------------------------------------------------+
    | IS_UUID('{6ccd780c-baba-1026-9564-5b8c656024db}') |
    +---------------------------------------------------+
    |                                                 1 |
    +---------------------------------------------------+
    mysql> SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c6560');
    +---------------------------------------------+
    | IS_UUID('6ccd780c-baba-1026-9564-5b8c6560') |
    +---------------------------------------------+
    |                                           0 |
    +---------------------------------------------+
    mysql> SELECT IS_UUID(RAND());
    +-----------------+
    | IS_UUID(RAND()) |
    +-----------------+
    |               0 |
    +-----------------+
  • MASTER_POS_WAIT(log_name,log_pos[,timeout][,channel])

    此功能对于控制主/从同步很有用。它会阻塞,直到从属设备已读取并将所有更新应用到主日志中的指定位置。返回值是从站必须等待前进到指定位置的日志事件数。NULL如果未启动从属SQL线程,未初始化从属主信息,参数不正确或发生错误,则函数返回。-1如果超出超时,则返回。如果从属SQL线程在MASTER_POS_WAIT()等待时停止, 则该函数返回NULL。如果从站超过指定位置,则该函数立即返回。

    上一个多线程从机,功能等待,直到由所述设置的限制期满 slave_checkpoint_group或 slave_checkpoint_period 系统变量,当检查点操作被称为更新从站的状态。因此,根据系统变量的设置,函数可能会在达到指定位置后返回一段时间。

    如果timeout指定了值,则 MASTER_POS_WAIT()timeout秒数过后停止等待。 timeout必须大于0; 零或负timeout意味着没有超时。

    可选channel值使您可以命名该函数适用的复制通道。有关更多信息请参见第17.2.3节“复制通道”

    此函数对于基于语句的复制不安全。如果在binlog_format设置 为时使用此功能,则会记录警告 STATEMENT

  • NAME_CONST(name,value)

    返回给定值。用于生成结果集列时,NAME_CONST()会使列具有给定名称。参数应该是常量。

    mysql> SELECT NAME_CONST('myname', 14);
    +--------+
    | myname |
    +--------+
    |     14 |
    +--------+

    此功能仅供内部使用。服务器在从包含对本地程序变量的引用的存储程序中编写语句时使用它,如 第24.7节“存储程序二进制日志记录”中所述。您可能会在mysqlbinlog的输出中看到此函数。

    对于您的应用程序,您可以使用简单的别名获得与刚刚显示的示例完全相同的结果,如下所示:

    mysql> SELECT 14 AS myname;
    +--------+
    | myname |
    +--------+
    |     14 |
    +--------+
    1 row in set (0.00 sec)

    有关列别名的更多信息 请参见第13.2.10节“SELECT语法”

  • SLEEP(duration)

    休眠(暂停)duration参数给出的秒数 ,然后返回0.持续时间可能有一个小数部分。如果参数为 NULL或为负,则 SLEEP()在严格SQL模式下生成警告或错误。

    当睡眠正常返回(没有中断)时,它返回0:

    mysql> SELECT SLEEP(1000);
    +-------------+
    | SLEEP(1000) |
    +-------------+
    |           0 |
    +-------------+

    何时SLEEP()是被中断的查询调用的唯一内容,它返回1并且查询本身不返回错误。无论查询是被终止还是超时,都是如此:

    • 使用KILL QUERY 另一个会话中断此语句 :

      mysql> SELECT SLEEP(1000);
      +-------------+
      | SLEEP(1000) |
      +-------------+
      |           1 |
      +-------------+
    • 超时会中断此声明:

      mysql> SELECT /*+ MAX_EXECUTION_TIME(1) */ SLEEP(1000);
      +-------------+
      | SLEEP(1000) |
      +-------------+
      |           1 |
      +-------------+

    如果SLEEP()只是查询中断的一部分,查询将返回错误:

    • 使用KILL QUERY 另一个会话中断此语句 :

      mysql> SELECT 1 FROM t1 WHERE SLEEP(1000);
      ERROR 1317 (70100): Query execution was interrupted
    • 超时会中断此声明:

      mysql> SELECT /*+ MAX_EXECUTION_TIME(1000) */ 1 FROM t1 WHERE SLEEP(1000);
      ERROR 3024 (HY000): Query execution was interrupted, maximum statement
      execution time exceeded

    此函数对于基于语句的复制不安全。如果在binlog_format设置 为时使用此功能,则会记录警告 STATEMENT

  • UUID()

    返回根据RFC 4122 “ A Universally Unique IDentifier(UUID)URN命名空间 ”生成的通用唯一标识符(UUID) (http://www.ietf.org/rfc/rfc4122.txt)。

    UUID被设计为在空间和时间上全球唯一的数字。UUID()预计两次调用将 生成两个不同的值,即使这些调用是在两个彼此未连接的独立设备上执行的。

    警告

    虽然UUID()价值观是独一无二的,但它们不一定是不可评论的或不可预测的。如果需要不可预测性,则应以其他方式生成UUID值。

    UUID()返回符合RFC 4122中描述的UUID版本1的值。该值是128位数字,表示为utf8 格式为五个十六进制数字的字符串 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee :

    • 前三个数字是从时间戳的低,中,高部分生成的。高部分还包括UUID版本号。

    • 如果时间戳值失去单调性(例如,由于夏令时),则第四个数字保留时间唯一性。

    • 第五个数字是提供空间唯一性的IEEE 802节点号。如果后者不可用,则替换随机数(例如,因为主机设备没有以太网卡,或者不知道如何在主机操作系统上找到接口的硬件地址)。在这种情况下,无法保证空间唯一性。然而,碰撞应该具有 非常低的概率。

      仅在FreeBSD和Linux上考虑接口的MAC地址。在其他操作系统上,MySQL使用随机生成的48位数字。

    mysql> SELECT UUID();
            -> '6ccd780c-baba-1026-9564-5b8c656024db'

    要在字符串和二进制UUID值之间进行转换,请使用 UUID_TO_BIN()和 BIN_TO_UUID()函数。要检查字符串是否为有效的UUID值,请使用该 IS_UUID()函数。

    注意

    UUID() 不适用于基于语句的复制。

  • UUID_SHORT()

    将“ 短 ”通用标识符作为64位无符号整数返回。返回的值 UUID_SHORT()UUID()函数返回的字符串格式128位标识符 不同,并且具有不同的唯一性属性。UUID_SHORT()如果满足以下条件,则保证值 是唯一的:

    • server_id当前服务器的值介于0和255之间,您的设置主从服务器中是唯一的

    • 您不会在mysqld restarts 之间设置服务器主机的系统时间

    • UUID_SHORT()mysqld重启 之间, 你平均每秒调用的次数少于1600万次

    UUID_SHORT()返回值的构造是这样的:

      (server_id & 255) << 56
    + (server_startup_time_in_seconds << 24)
    + incremented_variable++;
    mysql> SELECT UUID_SHORT();
            -> 92395783831158784
    注意

    UUID_SHORT() 不适用于基于语句的复制。

  • UUID_TO_BIN(string_uuid), UUID_TO_BIN(string_uuidswap_flag)

    将字符串UUID转换为二进制UUID并返回结果。(IS_UUID()函数描述列出了允许的字符串UUID格式。)返回二进制UUID是一个 VARBINARY(16)值。如果是UUID参数NULL,则返回值为 NULL。如果任何参数无效,则会发生错误。

    UUID_TO_BIN() 需要一个或两个参数:

    • 单参数形式采用字符串UUID值。二进制结果与字符串参数的顺序相同。

    • 双参数形式采用字符串UUID值和标志值:

      • 如果swap_flag为0,则双参数形式等效于单参数形式。二进制结果与字符串参数的顺序相同。

      • 如果swap_flag为1,则返回值的格式不同:交换时间低和时间高的部分(分别为第一组和第三组十六进制数字)。这会将更快速变化的部分向右移动,并且如果结果存储在索引列中,则可以提高索引效率。

    时间 - 部分交换假定使用UUID版本1值,例如由UUID()函数生成的 值。对于不遵循版本1格式的其他方法生成的UUID值,时间 - 部分交换不会带来任何好处。有关版本1格式的详细信息,请参阅 UUID()功能说明。

    假设您具有以下字符串UUID值:

    mysql> SET @uuid = '6ccd780c-baba-1026-9564-5b8c656024db';

    要使用或不使用时间 - 部分交换将字符串UUID转换为二进制,请使用UUID_TO_BIN()

    mysql> SELECT HEX(UUID_TO_BIN(@uuid));
    +----------------------------------+
    | HEX(UUID_TO_BIN(@uuid))          |
    +----------------------------------+
    | 6CCD780CBABA102695645B8C656024DB |
    +----------------------------------+
    mysql> SELECT HEX(UUID_TO_BIN(@uuid, 0));
    +----------------------------------+
    | HEX(UUID_TO_BIN(@uuid, 0))       |
    +----------------------------------+
    | 6CCD780CBABA102695645B8C656024DB |
    +----------------------------------+
    mysql> SELECT HEX(UUID_TO_BIN(@uuid, 1));
    +----------------------------------+
    | HEX(UUID_TO_BIN(@uuid, 1))       |
    +----------------------------------+
    | 1026BABA6CCD780C95645B8C656024DB |
    +----------------------------------+

    要将返回的二进制UUID转换为 UUID_TO_BIN()字符串UUID,请使用BIN_TO_UUID()。如果通过UUID_TO_BIN()使用第二个参数1来交换时间部分来生成二进制UUID ,则还应该传递第二个参数1,BIN_TO_UUID()以便在将二进制UUID转换回字符串UUID时取消交换时间部分 :

    mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid));
    +--------------------------------------+
    | BIN_TO_UUID(UUID_TO_BIN(@uuid))      |
    +--------------------------------------+
    | 6ccd780c-baba-1026-9564-5b8c656024db |
    +--------------------------------------+
    mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,0),0);
    +--------------------------------------+
    | BIN_TO_UUID(UUID_TO_BIN(@uuid,0),0)  |
    +--------------------------------------+
    | 6ccd780c-baba-1026-9564-5b8c656024db |
    +--------------------------------------+
    mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,1),1);
    +--------------------------------------+
    | BIN_TO_UUID(UUID_TO_BIN(@uuid,1),1)  |
    +--------------------------------------+
    | 6ccd780c-baba-1026-9564-5b8c656024db |
    +--------------------------------------+

    如果两个方向的转换使用时间 - 部分交换不相同,则原始UUID将无法正确恢复:

    mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,0),1);
    +--------------------------------------+
    | BIN_TO_UUID(UUID_TO_BIN(@uuid,0),1)  |
    +--------------------------------------+
    | baba1026-780c-6ccd-9564-5b8c656024db |
    +--------------------------------------+
    mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,1),0);
    +--------------------------------------+
    | BIN_TO_UUID(UUID_TO_BIN(@uuid,1),0)  |
    +--------------------------------------+
    | 1026baba-6ccd-780c-9564-5b8c656024db |
    +--------------------------------------+
  • VALUES(col_name)

    在 INSERT ... ON DUPLICATE KEY UPDATE语句中,您可以使用子句中的 函数来引用语句部分中的列值 。换句话说, 在子句中引用了将插入的值,没有发生重复键冲突。此功能在多行插入中特别有用。该 函数仅在语句的子句中有意义,否则返回。请参见 第13.2.6.2节“INSERT ... ON DUPLICATE KEY UPDATE语法”VALUES(col_name)UPDATEINSERTVALUES(col_name)UPDATEcol_nameVALUES()ON DUPLICATE KEY UPDATEINSERTNULL

    mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
        -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);






文章评论