其他功能
其他功能
名称 | 描述 |
---|---|
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() | 使列具有给定名称 |
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 tGROUP 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 tGROUP BY name ;在这种情况下,MySQL将忽略
address
每个name
组中值的不确定性,并接受查询。如果您根本不在乎为每个组选择未聚合列的哪个值,则这可能很有用。ANY_VALUE()
不是集合函数,不同于SUM()
或的函数COUNT()
。它只是起到抑制不确定性测试的作用。- 禁用
ONLY_FULL_GROUP_BY
。如上一项所述,这等效于使用ANY_VALUE()
withONLY_FULL_GROUP_BY
enabled。
ANY_VALUE()
如果列之间存在功能依赖关系,但MySQL无法确定,则该函数也很有用。以下查询是有效的,因为age
它在功能上依赖于分组列age-1
,但MySQL无法分辨并拒绝ONLY_FULL_GROUP_BY
启用了该查询:SELECT ageFROM tGROUP BY age-1;要使MySQL接受查询,请使用
ANY_VALUE()
:SELECT ANY_VALUE(age)FROM tGROUP 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()
有效依赖功能的列可能很有意义。有关更多讨论,请参见“ GROUP BY的MySQL处理”。
- 更改表以创建
BIN_TO_UUID(binary_uuid)
,BIN_TO_UUID(binary_uuid,swap_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
为0,则二参数形式等效于一参数形式。字符串结果与二进制参数的顺序相同。 - 如果
swap_flag
为1,则假定UUID值的低时和高时部分已互换。这些零件将交换回它们在结果值中的原始位置。
- 如果
有关用法示例和时分交换的信息,请参见
UUID_TO_BIN()
功能说明。DEFAULT(col_name)
返回表列的默认值。如果该列没有默认值,则会导致错误。
仅对于具有文字默认值的列,不允许使用为指定命名列的默认值,而对于具有表达式默认值的列,则不允许使用。
DEFAULT(col_name)
mysql>
UPDATE tSET i = DEFAULT(i)+1WHERE id < 100;FORMAT(X,D)
将数字
X
格式化为'#,###,###.##'
,将其舍入为D
小数位,然后将结果作为字符串返回。有关详细信息,请参见“字符串函数和运算符”。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 quantityFROM t1GROUP 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 quantityFROM t1GROUP BY name , sizeWITH 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_sizeFROM t1GROUP BY name , sizeWITH 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 quantityFROM t1GROUP BY name , sizeWITH 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 quantityFROM t1GROUP BY name , sizeWITH ROLLUP HAVING GROUPING(name ) = 1 OR GROUPING(size) = 1; +------ +------ +---------- + | name | size | quantity | +------ +------ +---------- + | ball | NULL | 35 | | hoop | NULL | 23 | | NULL | NULL | 58 | +------ +------ +---------- +
GROUPING()
允许多个表达式参数。在这种情况下,GROUPING()
返回值表示根据每个表达式的结果组合而成的位掩码,其中最低位对应于最右边表达式的结果。例如,使用三个表达式参数,其计算如下:GROUPING(expr1,expr2,expr3)
result
for GROUPING(expr3) + resultfor GROUPING(expr2) << 1 + resultfor 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_allFROM t1GROUP BY name , sizeWITH 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 quantityFROM t1GROUP BY name , sizeWITH 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 t1GROUP BY (SELECT MAX(name )FROM t1)WITH ROLLUP ; ERROR 3580 (HY000): Argument #1 of GROUPING function is not in GROUP BYGROUP BY
文字表达式不应在HAVING
子句中用作GROUPING()
参数。由于优化器评估GROUP BY
和之间的差异HAVING
,匹配可能会成功,但GROUPING()
评估不会产生预期的结果。考虑以下查询:SELECT aAS f1, 'w'AS f2FROM tGROUP BY f1, f2WITH ROLLUP HAVING GROUPING(f2) = 1;GROUPING()
对于字面常量表达式,要比对整个HAVING
子句更早地对其求值,并返回0。要检查诸如此类的查询是否受到影响,EXPLAIN
请Impossible 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地址相对应的值。请参见“超出范围和溢出处理”。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'- 不允许使用尾随区域ID,例如
INET6_NTOA(expr)
给定以数字形式表示为二进制字符串的IPv6或IPv4网络地址,以连接字符集中的字符串形式返回地址的字符串表示形式。如果参数不是有效地址,则
INET6_NTOA()
返回NULL
。INET6_NTOA()
具有以下属性:- 它不使用操作系统功能执行转换,因此输出字符串与平台无关。
返回字符串的最大长度为39(4 x 8 + 7)。鉴于此声明:
CREATE TABLE tAS SELECT INET6_NTOA(expr)AS c1;结果表将具有以下定义:
CREATE TABLE t (c1 VARCHAR(39)CHARACTER SET utf8DEFAULT 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()
)将返回non-NULL
。相反的说法不正确:在某些情况下,当返回0 时返回INET_ATON()
non 。NULL
IS_IPV4()
正如前面的言论所暗示的,
IS_IPV4()
它比INET_ATON()
构成有效IPv4地址的内容更为严格,因此对于需要对无效值执行严格检查的应用程序可能很有用。或者,用于INET6_ATON()
将IPv4地址转换为内部格式并检查NULL
结果(指示无效地址)。INET6_ATON()
与IS_IPV4()
检查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')); -> 0IPv4兼容地址的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, 1IS_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, 1IS_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()
则将返回non-NULL
。IS_UUID(string_uuid)
返回1,如果该参数是一个有效的字符串格式的UUID,0如果参数是不是有效的UUID,并且
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
值使您能够命名该功能应用于哪个复制通道。有关更多信息,请参见“复制通道”。此功能对于基于语句的复制不安全。设置为时,如果使用此功能,
binlog_format
将记录警告STATEMENT
。NAME_CONST(name,value)
返回给定值。当用于产生结果集列时,
NAME_CONST()
使该列具有给定的名称。参数应为常量。mysql>
SELECT NAME_CONST('myname', 14); +-------- + | myname | +-------- + | 14 | +-------- +此功能仅供内部使用。如“存储的程序二进制日志记录”中所述,服务器在从包含引用到本地程序变量的存储程序中编写语句时使用它。您可能会在mysqlbinlog的输出中看到此函数。
对于您的应用程序,您可以使用简单的别名来获得与刚刚显示的示例完全相同的结果,如下所示:
mysql>
SELECT 14AS myname; +-------- + | myname | +-------- + | 14 | +-------- + 1 row in set (0.00 sec)有关列别名的更多信息,请参见“ 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 1FROM t1WHERE SLEEP(1000); ERROR 1317 (70100): Query execution was interrupted该语句因超时而中断:
mysql>
SELECT /*+ MAX_EXECUTION_TIME(1000) */ 1FROM t1WHERE SLEEP(1000); ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded
此功能对于基于语句的复制不安全。设置为时,如果使用此功能,
binlog_format
将记录警告STATEMENT
。UUID()
返回根据RFC 4122 “通用唯一标识符(UUID)URN命名空间”(http://www.ietf.org/rfc/rfc4122.txt)生成的通用唯一标识符(UUID)。
UUID被设计为在空间和时间上全局唯一的数字。到两个呼叫
UUID()
预期产生两个不同的值,即使这些调用上不彼此连接的两个独立的设备进行。警告
尽管
UUID()
值旨在唯一,但不一定是不可猜测或不可预测的。如果需要不可预测性,则应以其他方式生成UUID值。UUID()
返回一个值,该值符合RFC 4122中所述的UUID版本1。该值是一个128位数字,表示为utf8
五个十六进制数字的字符串,aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
格式为:- 前三个数字是从时间戳的低,中和高部分生成的。较高的部分还包括UUID版本号。
- 万一时间戳值失去单调性(例如,由于夏时制),第四个数字将保留时间唯一性。
第五个数字是提供空间唯一性的IEEE 802节点号。如果后者不可用,则用随机数代替(例如,因为主机设备没有以太网卡,或者未知如何在主机操作系统上找到接口的硬件地址)。在这种情况下,不能保证空间唯一性。尽管如此,碰撞的可能性应该很小。
仅在FreeBSD,Linux和Windows上才考虑接口的MAC地址。在其他操作系统上,MySQL使用随机生成的48位数字。
mysql>
SELECT UUID(); -> '6ccd780c-baba-1026-9564-5b8c656024db'要在字符串和二进制UUID值之间转换,请使用
UUID_TO_BIN()
和BIN_TO_UUID()
函数。要检查字符串是否为有效的UUID值,请使用IS_UUID()
函数。此功能对于基于语句的复制不安全。设置为时,如果使用此功能,
binlog_format
将记录警告STATEMENT
。UUID_SHORT()
以64位无符号整数形式返回“ short ”通用标识符。返回的值
UUID_SHORT()
不同于UUID()
函数返回的字符串格式的128位标识符,并且具有不同的唯一性属性。UUID_SHORT()
如果满足以下条件,则保证值是唯一的:- 在
server_id
当前服务器的值介于0和255之间,您的设置主从服务器中是唯一的 - 您不会在mysqld重新启动之间为服务器主机设置系统时间
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_uuid,swap_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,则BIN_TO_UUID()
在将二进制UUID转换回字符串UUID时,还应该传递第二个参数1来交换时间部分: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
语句中,可以使用子句中的函数来引用语句部分中的列值。换句话说,在子句中引用的是在没有重复键冲突的情况下将被插入的值。此功能在多行插入中特别有用。该函数仅在语句子句中有意义,否则返回。VALUES(col_name)
UPDATE
INSERT
VALUES(col_name)
UPDATE
col_name
VALUES()
ON DUPLICATE KEY UPDATE
INSERT
NULL
mysql>
INSERT INTO table (a,b,c)VALUES (1,2,3),(4,5,6) ->ON DUPLICATE KEY UPDATE c=VALUES (a)+VALUES (b);重要
这种用法在MySQL 8.0.20中已弃用,并且在将来的MySQL版本中可能会删除。请改用行别名或行和列别名。有关更多信息和示例,请参见“在重复密钥更新语句上插入...”。