10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

12.21杂项功能

表12.26杂项函数

的名字 描述
ANY_VALUE () 抑制ONLY_FULL_GROUP_BY值拒绝
默认的() 返回表列的默认值
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地址
MASTER_POS_WAIT () 阻塞,直到副本读取并应用所有更新到指定位置为止
NAME_CONST () 使列具有给定的名称
睡眠() 多睡几秒钟
UUID () 返回一个通用唯一标识符(UUID)
UUID_SHORT () 返回整数值的通用标识符
值() 定义要在INSERT期间使用的值

  • ANY_VALUE (参数

    此函数用于集团查询的时候ONLY_FULL_GROUP_BY当MySQL因为无法确定的原因而拒绝一个您知道有效的查询时,启用SQL模式。函数的返回值和类型与其实参的返回值和类型相同,但不检查函数结果ONLY_FULL_GROUP_BYSQL模式。

    例如,如果的名字是否为非索引列,则以下查询将失败ONLY_FULL_GROUP_BY启用:

    SELECT name, address, MAX(age) FROM t GROUP BY name;错误1055 (42000):SELECT列表的表达式#2不在GROUP BY子句中,并且包含非聚合列'mydb.t。address'不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容

    失败的发生是因为地址是否没有命名的非聚合列集团列也不依赖于它们。结果,地址的值的名字组是不确定的。有多种方法可以使MySQL接受查询:

    • 修改表使的名字主键或唯一键非空列。这使MySQL能够确定这一点地址在功能上依赖于的名字;也就是说,地址是由的名字.(此技术不适用于必须被允许为有效的吗的名字值)。

    • 使用ANY_VALUE ()地址

      SELECT name, ANY_VALUE(地址),MAX(年龄)FROM GROUP BY name

      在这种情况下,MySQL忽略的不确定性地址值在每个的名字分组并接受查询。如果您根本不关心为每个组选择非聚合列的哪个值,那么这可能很有用。ANY_VALUE ()不是聚合函数,不像SUM ()COUNT ().它只是用来抑制对不确定性的检验。

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

    ANY_VALUE ()如果列之间存在函数依赖,但MySQL无法确定它,则此方法也很有用。以下查询是有效的,因为年龄是否在功能上依赖于分组列1岁左右的,但是MySQL无法识别并拒绝使用ONLY_FULL_GROUP_BY启用:

    查询年龄为1岁的年龄组

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

    SELECT ANY_VALUE(年龄)FROM t GROUP BY age-1

    ANY_VALUE ()可以用于引用聚合函数的查询集团条款:

    mysql> SELECT name, MAX(age) FROM;错误1140(42000):在没有GROUP BY的聚合查询中,SELECT列表的表达式#1包含非聚合列'mydb. t.t name';这与sql_mode=only_full_group_by不兼容

    没有集团,有一个单一的群体,它是不确定的的名字值要为组选择。ANY_VALUE ()告诉MySQL接受查询:

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

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

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

  • 违约(col_name

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

    SET i = DEFAULT(i)+1 WHERE id < 100;
  • 格式(XD

    格式数量X像这样的格式'#,###,###.##'圆形的,D小数位,并以字符串形式返回结果。有关详细信息,请参见第12.8节“字符串函数和操作符”

  • INET_ATON (expr

    给定IPv4网络地址的点四表示形式为字符串,返回一个整数,该整数按网络字节顺序表示地址的数值(大端序)。INET_ATON ()返回如果它不理解它的论点。

    mysql >选择INET_ATON(“10.0.5.9”);- > 167773449

    对于本例,返回值计算为10×2563.+ 0×2562+ 5×256 + 9。

    INET_ATON ()可以或不可以返回一个非的短形式IP地址(如“127.1”作为一个代表“127.0.0.1”).由于这个原因,INET_ATON ()A不应用于此类地址。

    请注意

    存储由…产生的值INET_ATON (),使用一个INT无符号列而不是INT,有签名。如果使用带符号列,则不能正确存储IP地址首字节大于127的值。看到第11.1.7节“超出范围和溢出处理”

  • INET_NTOA (expr

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

    mysql >选择INET_NTOA (167773449);——>“10.0.5.9”
  • INET6_ATON (expr

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

    以下示例使用十六进制()来显示INET6_ATON ()结果以可打印的形式:

    mysql >选择十六进制(INET6_ATON(“fdfe:: 5 a55:茶馆:阿富汗自由及公平选举基金会:9089 '));-> 'FDFE0000000000005A55CAFFFEFA9089' mysql> SELECT HEX(INET6_ATON('10.0.5.9'));——>“0 a000509”

    INET6_ATON ()观察有效参数的几个约束条件。下面的列表中给出了这些功能,并附有示例。

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

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

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

    使用实例转换IPv4地址expr用数字形式表示为INT值转换为以数字形式表示的IPv6地址VARBINARY值,使用这个表达式:

    INET6_ATON (INET_NTOA (expr))

    例如:

    mysql >选择十六进制(INET6_ATON (INET_NTOA (167773449)));——>“0 a000509”
  • INET6_NTOA (expr

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

    INET6_NTOA ()这些属性:

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

    • 返回字符串的最大长度为39 (4 x 8 + 7)。

      创建表t为SELECT INET6_NTOAexprc1);

      结果表将有这样的定义:

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

    mysql >选择INET6_NTOA (INET6_ATON(“fdfe:: 5 a55:茶馆:阿富汗自由及公平选举基金会: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 >选择IS_IPV4 (10.0.5.9), IS_IPV4(“10.0.5.256”);- > 1, 0

    对于一个给定的参数,如果IS_IPV4 ()返回1,INET_ATON ()(和INET6_ATON ())返回不是的值.相反的说法是不对的:在某些情况下,INET_ATON ()返回的值不是IS_IPV4 ()返回0。

    如上所述,IS_IPV4 ()INET_ATON ()因此,对于需要对无效值执行强检查的应用程序来说,它可能是有用的。另外,使用INET6_ATON ()将IPv4地址转换为内部形式,并检查结果(指示无效的地址)。INET6_ATON ()IS_IPV4 ()关于IPv4地址检查。

  • IS_IPV4_COMPAT (expr

    该函数接受一个以数字形式表示的二进制字符串的IPv6地址,如返回的INET6_ATON ().如果参数是有效的ipv4兼容IPv6地址,则返回1,否则返回0。ipv4兼容的地址有这样的格式::ipv4_address

    mysql >选择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 >选择十六进制(INET6_ATON (' 198.51.100.1 '));——>“C6336401”

    以ipv4兼容的形式表示,:: 198.51.100.1相当于:: c0a8:0001或(不带前导零):: c0a8:1

    mysql >选择- > 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映射地址的格式为::飞行符:ipv4_address

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

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

    mysql >选择- > IS_IPV4_MAPPED (INET6_ATON(::飞行符:198.51.100.1)),- - - - - - > IS_IPV4_MAPPED (INET6_ATON(::飞行符:c0a8:0001)), - - - - - - > IS_IPV4_MAPPED (INET6_ATON(::飞行符:c0a8:1));-> 1,1,1
  • IS_IPV6 (expr

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

    mysql >选择IS_IPV6 (10.0.5.9), IS_IPV6 (:: 1);- > 0, 1

    对于一个给定的参数,如果IS_IPV6 ()返回1,INET6_ATON ()返回一个THT si not的值

  • MASTER_POS_WAIT (log_namelog_pos(,超时] [,通道])

    此函数用于控制源/副本同步。它会阻塞,直到副本读取并应用所有更新到源日志中的指定位置为止。返回值是副本必须等待前进到指定位置的日志事件的数量。函数返回如果副本SQL线程没有启动,副本的源信息没有初始化,参数不正确,或者发生错误。它返回-1如果超时已超过。如果复制SQL线程在MASTER_POS_WAIT ()是否等待函数返回.如果副本超过指定的位置,函数立即返回。

    类设置的限制到期之前,该函数将一直等待slave_checkpoint_groupslave_checkpoint_period系统变量,当调用检查点操作来更新副本的状态时。因此,根据对系统变量的设置,函数可能在到达指定位置后的一段时间返回。

    如果一个超时指定值,MASTER_POS_WAIT ()停止等待时超时秒的时间。超时必须大于0;0或负数超时意味着没有超时。

    可选通道取值后,可指定该功能应用的复制区域通道名称。看到第16.2.2节“复制通道”为更多的信息。

    此函数对于基于语句的复制是不安全的。当您使用此函数时,将记录一个警告binlog_format被设置为声明

  • NAME_CONST (的名字价值

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

    SELECT name ('myname', 14);+--------+ | 的名字  | +--------+ | 14  | +--------+

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

    对于你的应用程序,你可以通过使用简单的别名获得和刚才例子中完全相同的结果,就像这样:

    SELECT 14 AS myname;+--------+ | 的名字  | +--------+ | 14  | +--------+ 1行集(0.00秒)

    看到第13.2.9节,“SELECT语句”,以获取有关列别名的更多信息。

  • 睡眠(持续时间

    方法给出的秒数休眠(暂停)持续时间参数,然后返回0。持续时间可以是小数部分。如果论证是或消极,睡眠()在严格SQL模式下产生警告或错误。

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

    mysql >选择睡眠(1000);+-------------+ | 睡眠(1000 ) | +-------------+ | 0  | +-------------+

    睡眠()是查询调用的唯一被中断的东西,它返回1,查询本身不返回错误。无论查询被杀死还是超时,这都是正确的:

    • 此语句使用杀死查询从另一个会话:

      mysql >选择睡眠(1000);+-------------+ | 睡眠(1000 ) | +-------------+ | 1  | +-------------+
    • 该语句被超时打断:

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

    睡眠()是查询的一部分被中断,查询返回一个错误:

    • 此语句使用杀死查询从另一个会话:

      SELECT 1 FROM t1 WHERE SLEEP(1000);错误1317(70100):查询执行中断
    • 该语句被超时打断:

      SELECT /*+ MAX_EXECUTION_TIME(1000) */ 1 FROM t1 WHERE SLEEP(1000);错误3024 (HY000):查询执行被中断,最大语句执行时间超过

    此函数对于基于语句的复制是不安全的。当您使用此函数时,将记录一个警告binlog_format被设置为声明

  • UUID ()

    返回根据RFC 4122生成的通用唯一标识符(UUID),UUID URN命名空间"http://www.ietf.org/rfc/rfc4122.txt).

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

    警告

    虽然UUID ()值应该是唯一的,它们不一定是不可猜测或不可预测的。如果需要不可预测性,则应该以其他方式生成UUID值。

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

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

    • 第四个数字保持时间唯一性,以防时间戳值失去单调性(例如,由于日光节约时间)。

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

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

    mysql >选择UUID ();——>“6 ccd780c——巴巴- 1026 - 9564 - 5 - b8c656024db”

    此函数对于基于语句的复制是不安全的。当您使用此函数时,将记录一个警告binlog_format被设置为声明

  • UUID_SHORT ()

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

    • server_id当前服务器的值在0到255之间,并且在源服务器和复制服务器集合中是惟一的

    • 您没有在之间设置服务器主机的系统时间mysqld重新启动

    • 您调用UUID_SHORT ()平均每秒不到1600万次mysqld重新启动

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

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

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

  • 值(col_name

    在一个插入……重复密钥更新语句中,可以使用值(col_name功能更新子句引用列值插入陈述的一部分。换句话说,值(col_name更新子句指的是价值col_name如果没有发生重复键冲突,就会插入。这个函数在多行插入中特别有用。的值()函数只有在重复密钥更新条款插入声明并返回否则。看到第13.2.5.2节,“插入…关于重复密钥更新声明"

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