📣

TiDB Cloud Serverless 现已更名为
Starter
!此页面由 AI 自动翻译,英文原文请见
此处。

杂项函数

TiDB 支持 MySQL 8.0 中大多数的 杂项函数

支持的函数

名称描述
ANY_VALUE()抑制 ONLY_FULL_GROUP_BY 对值的拒绝
BIN_TO_UUID()将 UUID 从二进制格式转换为文本格式
DEFAULT()返回数据表列的默认值
GROUPING()用于 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 地址
IS_UUID()判断参数是否为 UUID
NAME_CONST()可用于重命名列名
SLEEP()休眠指定秒数。注意,对于 TiDB Cloud ServerlessTiDB Cloud Essential 集群,SLEEP() 函数有最大 300 秒的休眠时间限制。
UUID()返回一个全局唯一标识符(UUID)
UUID_TO_BIN()将 UUID 从文本格式转换为二进制格式
VALUES()定义在 INSERT 期间要使用的值

ANY_VALUE()

ANY_VALUE() 函数从一组值中返回任意一个值。通常用于在带有 GROUP BY 子句的 SELECT 语句中,需要包含非聚合列的场景。

CREATE TABLE fruits (id INT PRIMARY KEY, name VARCHAR(255)); Query OK, 0 rows affected (0.14 sec) INSERT INTO fruits VALUES (1,'apple'),(2,'apple'),(3,'pear'),(4,'banana'),(5, 'pineapple'); Query OK, 5 rows affected (0.01 sec) Records: 5 Duplicates: 0 Warnings: 0 SELECT id,name FROM fruits GROUP BY name; ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.fruits.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by SELECT ANY_VALUE(id),GROUP_CONCAT(id),name FROM fruits GROUP BY name; +---------------+------------------+-----------+ | ANY_VALUE(id) | GROUP_CONCAT(id) | name | +---------------+------------------+-----------+ | 1 | 1,2 | apple | | 3 | 3 | pear | | 4 | 4 | banana | | 5 | 5 | pineapple | +---------------+------------------+-----------+ 4 rows in set (0.00 sec)

在上述示例中,TiDB 对第一个 SELECT 语句返回错误,因为 id 列是非聚合列且未包含在 GROUP BY 子句中。为了解决该问题,第二个 SELECT 查询使用 ANY_VALUE() 从每个分组中获取任意一个值,并使用 GROUP_CONCAT() 将每个分组内的所有 id 列的值拼接为一个字符串。该方法可以在不更改 SQL 模式的情况下,获取每个分组的一个值以及该分组的所有值。

BIN_TO_UUID()

BIN_TO_UUID()UUID_TO_BIN() 可用于在文本格式 UUID 和二进制格式之间进行转换。两个函数都接受两个参数。

  • 第一个参数指定要转换的值。
  • 第二个参数(可选)用于控制二进制格式中字段的排序。
SET @a := UUID(); Query OK, 0 rows affected (0.00 sec) SELECT @a; +--------------------------------------+ | @a | +--------------------------------------+ | 9a17b457-eb6d-11ee-bacf-5405db7aad56 | +--------------------------------------+ 1 row in set (0.00 sec) SELECT UUID_TO_BIN(@a); +------------------------------------+ | UUID_TO_BIN(@a) | +------------------------------------+ | 0x9A17B457EB6D11EEBACF5405DB7AAD56 | +------------------------------------+ 1 row in set (0.00 sec) SELECT BIN_TO_UUID(0x9A17B457EB6D11EEBACF5405DB7AAD56); +-------------------------------------------------+ | BIN_TO_UUID(0x9A17B457EB6D11EEBACF5405DB7AAD56) | +-------------------------------------------------+ | 9a17b457-eb6d-11ee-bacf-5405db7aad56 | +-------------------------------------------------+ 1 row in set (0.00 sec) SELECT UUID_TO_BIN(@a, 1); +----------------------------------------+ | UUID_TO_BIN(@a, 1) | +----------------------------------------+ | 0x11EEEB6D9A17B457BACF5405DB7AAD56 | +----------------------------------------+ 1 row in set (0.00 sec) SELECT BIN_TO_UUID(0x11EEEB6D9A17B457BACF5405DB7AAD56, 1); +----------------------------------------------------+ | BIN_TO_UUID(0x11EEEB6D9A17B457BACF5405DB7AAD56, 1) | +----------------------------------------------------+ | 9a17b457-eb6d-11ee-bacf-5405db7aad56 | +----------------------------------------------------+ 1 row in set (0.00 sec)

另请参阅 UUID()UUID 最佳实践

DEFAULT()

DEFAULT() 函数用于获取某一列的默认值。

CREATE TABLE t1 (id INT PRIMARY KEY, c1 INT DEFAULT 5); Query OK, 0 rows affected (0.15 sec) INSERT INTO t1 VALUES (1, 1); Query OK, 1 row affected (0.01 sec) UPDATE t1 SET c1=DEFAULT(c1)+3; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0 TABLE t1; +----+------+ | id | c1 | +----+------+ | 1 | 8 | +----+------+ 1 row in set (0.00 sec)

在上述示例中,UPDATE 语句将 c1 列的值设置为该列的默认值(即 5)加上 3,最终结果为 8

GROUPING()

参见 GROUP BY 修饰符

INET_ATON()

INET_ATON() 函数将点分十进制表示的 IPv4 地址转换为可以高效存储的数值。

SELECT INET_ATON('127.0.0.1');
+------------------------+ | INET_ATON('127.0.0.1') | +------------------------+ | 2130706433 | +------------------------+ 1 row in set (0.00 sec)

INET_NTOA()

INET_NTOA() 函数将数值形式的 IPv4 地址转换为点分十进制表示。

SELECT INET_NTOA(2130706433);
+-----------------------+ | INET_NTOA(2130706433) | +-----------------------+ | 127.0.0.1 | +-----------------------+ 1 row in set (0.00 sec)

INET6_ATON()

INET6_ATON() 函数与 INET_ATON() 类似,但 INET6_ATON() 还可以处理 IPv6 地址。

SELECT INET6_ATON('::1');
+--------------------------------------+ | INET6_ATON('::1') | +--------------------------------------+ | 0x00000000000000000000000000000001 | +--------------------------------------+ 1 row in set (0.00 sec)

INET6_NTOA()

INET6_NTOA() 函数与 INET_NTOA() 类似,但 INET6_NTOA() 还可以处理 IPv6 地址。

SELECT INET6_NTOA(0x00000000000000000000000000000001);
+------------------------------------------------+ | INET6_NTOA(0x00000000000000000000000000000001) | +------------------------------------------------+ | ::1 | +------------------------------------------------+ 1 row in set (0.00 sec)

IS_IPV4()

IS_IPV4() 函数用于判断给定参数是否为 IPv4 地址。

SELECT IS_IPV4('127.0.0.1');
+----------------------+ | IS_IPV4('127.0.0.1') | +----------------------+ | 1 | +----------------------+ 1 row in set (0.00 sec)
SELECT IS_IPV4('300.0.0.1');
+----------------------+ | IS_IPV4('300.0.0.1') | +----------------------+ | 0 | +----------------------+ 1 row in set (0.00 sec)

IS_IPV4_COMPAT()

IS_IPV4_COMPAT() 函数用于判断给定参数是否为 IPv4 兼容地址。

SELECT IS_IPV4_COMPAT(INET6_ATON('::127.0.0.1'));
+-------------------------------------------+ | IS_IPV4_COMPAT(INET6_ATON('::127.0.0.1')) | +-------------------------------------------+ | 1 | +-------------------------------------------+ 1 row in set (0.00 sec)

IS_IPV4_MAPPED()

IS_IPV4_MAPPED() 函数用于判断给定参数是否为 IPv4 映射地址。

SELECT IS_IPV4_MAPPED(INET6_ATON('::ffff:127.0.0.1'));
+------------------------------------------------+ | IS_IPV4_MAPPED(INET6_ATON('::ffff:127.0.0.1')) | +------------------------------------------------+ | 1 | +------------------------------------------------+ 1 row in set (0.00 sec)

IS_IPV6()

IS_IPV6() 函数用于判断给定参数是否为 IPv6 地址。

SELECT IS_IPV6('::1');
+----------------+ | IS_IPV6('::1') | +----------------+ | 1 | +----------------+ 1 row in set (0.00 sec)

IS_UUID()

IS_UUID() 函数用于判断给定参数是否为 UUID

SELECT IS_UUID('eb48c08c-eb71-11ee-bacf-5405db7aad56');
+-------------------------------------------------+ | IS_UUID('eb48c08c-eb71-11ee-bacf-5405db7aad56') | +-------------------------------------------------+ | 1 | +-------------------------------------------------+ 1 row in set (0.00 sec)

NAME_CONST()

NAME_CONST() 函数用于为列命名。推荐使用列别名的方式代替。

SELECT NAME_CONST('column name', 'value') UNION ALL SELECT 'another value';
+---------------+ | column name | +---------------+ | another value | | value | +---------------+ 2 rows in set (0.00 sec)

上述语句使用了 NAME_CONST(),而下述语句使用了推荐的列别名方式。

SELECT 'value' AS 'column name' UNION ALL SELECT 'another value';
+---------------+ | column name | +---------------+ | value | | another value | +---------------+ 2 rows in set (0.00 sec)

SLEEP()

SLEEP() 函数用于让查询暂停指定的秒数。

SELECT SLEEP(1.5);
+------------+ | SLEEP(1.5) | +------------+ | 0 | +------------+ 1 row in set (1.50 sec)

UUID()

UUID() 函数返回一个符合 RFC 4122 定义的全局唯一标识符(UUID)版本 1。

SELECT UUID();
+--------------------------------------+ | UUID() | +--------------------------------------+ | cb4d5ae6-eb6b-11ee-bacf-5405db7aad56 | +--------------------------------------+ 1 row in set (0.00 sec)

另请参阅 UUID 最佳实践

UUID_TO_BIN

参见 BIN_TO_UUID()

VALUES()

VALUES(col_name) 函数用于在 INSERT 语句的 ON DUPLICATE KEY UPDATE 子句中引用指定列的值。

CREATE TABLE t1 (id INT PRIMARY KEY, c1 INT); Query OK, 0 rows affected (0.17 sec) INSERT INTO t1 VALUES (1,51),(2,52),(3,53),(4,54),(5,55); Query OK, 5 rows affected (0.01 sec) Records: 5 Duplicates: 0 Warnings: 0 INSERT INTO t1 VALUES(2,22),(4,44) ON DUPLICATE KEY UPDATE c1=VALUES(id)+100; Query OK, 4 rows affected (0.01 sec) Records: 2 Duplicates: 2 Warnings: 0 TABLE t1; +----+------+ | id | c1 | +----+------+ | 1 | 51 | | 2 | 102 | | 3 | 53 | | 4 | 104 | | 5 | 55 | +----+------+ 5 rows in set (0.00 sec)

不支持的函数

名称描述
UUID_SHORT()提供一个在特定假设下唯一的 UUID,但这些假设在 TiDB 中不成立 TiDB #4620

文档内容是否有帮助?