表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期间使用的值 |
此函数用于
集团
查询的时候ONLY_FULL_GROUP_BY
当MySQL因为无法确定的原因而拒绝一个您知道有效的查询时,启用SQL模式。函数的返回值和类型与其实参的返回值和类型相同,但不检查函数结果ONLY_FULL_GROUP_BY
SQL模式。例如,如果
的名字
是否为非索引列,则以下查询将失败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的处理”.
返回表列的默认值。如果列没有默认值,则会导致错误。
SET i = DEFAULT(i)+1 WHERE id < 100;
格式数量
X
像这样的格式'#,###,###.##'
圆形的,D
小数位,并以字符串形式返回结果。有关详细信息,请参见第12.8节“字符串函数和操作符”.给定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节“超出范围和溢出处理”.给定按网络字节顺序排列的数字IPv4网络地址,返回该地址作为连接字符集中的字符串的点四字符串表示形式。
INET_NTOA ()
返回零
如果它不理解它的论点。mysql >选择INET_NTOA (167773449);——>“10.0.5.9”
给定一个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% 1
或eth0 fe80:: 3%
.不允许使用尾随网络掩码,例如
2001:45f: 3: ba:: / 64
或198.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”
给定以数字形式表示为二进制字符串的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”
如果参数是指定为字符串的有效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地址检查。该函数接受一个以数字形式表示的二进制字符串的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
该函数接受一个以数字形式表示的二进制字符串的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
如果参数是指定为字符串的有效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_name
,log_pos
(,超时
] [,通道
])此函数用于控制源/副本同步。它会阻塞,直到副本读取并应用所有更新到源日志中的指定位置为止。返回值是副本必须等待前进到指定位置的日志事件的数量。函数返回
零
如果副本SQL线程没有启动,副本的源信息没有初始化,参数不正确,或者发生错误。它返回-1
如果超时已超过。如果复制SQL线程在MASTER_POS_WAIT ()
是否等待函数返回零
.如果副本超过指定的位置,函数立即返回。类设置的限制到期之前,该函数将一直等待
slave_checkpoint_group
或slave_checkpoint_period
系统变量,当调用检查点操作来更新副本的状态时。因此,根据对系统变量的设置,函数可能在到达指定位置后的一段时间返回。如果一个
超时
指定值,MASTER_POS_WAIT ()
停止等待时超时
秒的时间。超时
必须大于0;0或负数超时
意味着没有超时。可选
通道
取值后,可指定该功能应用的复制区域通道名称。看到第16.2.2节“复制通道”为更多的信息。此函数对于基于语句的复制是不安全的。当您使用此函数时,将记录一个警告
binlog_format
被设置为声明
.返回给定的值。当用于生成结果集列时,
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
被设置为声明
.返回根据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
被设置为声明
.返回一个”短"作为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
如果没有发生重复键冲突,就会插入。这个函数在多行插入中特别有用。的值()
函数只有在重复密钥更新
条款插入
声明并返回零
否则。看到第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);