其他函数

TiDB 支持使用 MySQL 8.0 中提供的大部分其他函数

支持的函数

函数名功能描述
ANY_VALUE()ONLY_FULL_GROUP_BY 模式下,防止带有 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()让语句暂停执行几秒时间
UUID()返回一个通用唯一识别码 (UUID)
UUID_TO_BIN()将 UUID 从文本格式转换为二进制格式
VALUES()定义 INSERT 语句使用的值

ANY_VALUE()

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

  1. CREATE TABLE fruits (id INT PRIMARY KEY, name VARCHAR(255));
  2. Query OK, 0 rows affected (0.14 sec)
  3. INSERT INTO fruits VALUES (1,'apple'),(2,'apple'),(3,'pear'),(4,'banana'),(5, 'pineapple');
  4. Query OK, 5 rows affected (0.01 sec)
  5. Records: 5 Duplicates: 0 Warnings: 0
  6. SELECT id,name FROM fruits GROUP BY name;
  7. 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
  8. SELECT ANY_VALUE(id),GROUP_CONCAT(id),name FROM fruits GROUP BY name;
  9. +---------------+------------------+-----------+
  10. | ANY_VALUE(id) | GROUP_CONCAT(id) | name |
  11. +---------------+------------------+-----------+
  12. | 1 | 1,2 | apple |
  13. | 3 | 3 | pear |
  14. | 4 | 4 | banana |
  15. | 5 | 5 | pineapple |
  16. +---------------+------------------+-----------+
  17. 4 rows in set (0.00 sec)

在以上示例中,执行了第一条 SELECT 语句后,TiDB 返回了一条错误,这是因为 id 列是非聚合列且未包含在 GROUP BY 子句中。为了解决此问题,第二个 SELECT 查询使用了 ANY_VALUE() 从每个组中获取任意值,并使用了 GROUP_CONCAT() 将每个组中 id 列的所有值拼接成一个字符串。通过这种方法,你可以获取每个组中的一个值以及该组的所有值,而无需改变非聚合列的 SQL 模式。

BIN_TO_UUID()

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

  • 第一个参数用于指定要转换的值。
  • 第二个参数(可选)用于控制二进制格式中字段的排序。
  1. SET @a := UUID();
  2. Query OK, 0 rows affected (0.00 sec)
  3. SELECT @a;
  4. +--------------------------------------+
  5. | @a |
  6. +--------------------------------------+
  7. | 9a17b457-eb6d-11ee-bacf-5405db7aad56 |
  8. +--------------------------------------+
  9. 1 row in set (0.00 sec)
  10. SELECT UUID_TO_BIN(@a);
  11. +------------------------------------+
  12. | UUID_TO_BIN(@a) |
  13. +------------------------------------+
  14. | 0x9A17B457EB6D11EEBACF5405DB7AAD56 |
  15. +------------------------------------+
  16. 1 row in set (0.00 sec)
  17. SELECT BIN_TO_UUID(0x9A17B457EB6D11EEBACF5405DB7AAD56);
  18. +-------------------------------------------------+
  19. | BIN_TO_UUID(0x9A17B457EB6D11EEBACF5405DB7AAD56) |
  20. +-------------------------------------------------+
  21. | 9a17b457-eb6d-11ee-bacf-5405db7aad56 |
  22. +-------------------------------------------------+
  23. 1 row in set (0.00 sec)
  24. SELECT UUID_TO_BIN(@a, 1);
  25. +----------------------------------------+
  26. | UUID_TO_BIN(@a, 1) |
  27. +----------------------------------------+
  28. | 0x11EEEB6D9A17B457BACF5405DB7AAD56 |
  29. +----------------------------------------+
  30. 1 row in set (0.00 sec)
  31. SELECT BIN_TO_UUID(0x11EEEB6D9A17B457BACF5405DB7AAD56, 1);
  32. +----------------------------------------------------+
  33. | BIN_TO_UUID(0x11EEEB6D9A17B457BACF5405DB7AAD56, 1) |
  34. +----------------------------------------------------+
  35. | 9a17b457-eb6d-11ee-bacf-5405db7aad56 |
  36. +----------------------------------------------------+
  37. 1 row in set (0.00 sec)

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

DEFAULT()

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

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

在以上示例中,UPDATE 语句将 c1 列的值设置为列的默认值(即 5)加 3,从而得到一个新值 8

GROUPING()

参见 GROUP BY 修饰符

INET_ATON()

INET_ATON() 函数用于将点分十进制形式表示的 IPv4 地址转换为可有效存储的二进制形式。

  1. SELECT INET_ATON('127.0.0.1');
  1. +------------------------+
  2. | INET_ATON('127.0.0.1') |
  3. +------------------------+
  4. | 2130706433 |
  5. +------------------------+
  6. 1 row in set (0.00 sec)

INET_NTOA()

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

  1. SELECT INET_NTOA(2130706433);
  1. +-----------------------+
  2. | INET_NTOA(2130706433) |
  3. +-----------------------+
  4. | 127.0.0.1 |
  5. +-----------------------+
  6. 1 row in set (0.00 sec)

INET6_ATON()

INET6_ATON() 函数的功能类似于 INET_ATON(),但 INET6_ATON() 还可以处理 IPv6 地址。

  1. SELECT INET6_ATON('::1');
  1. +--------------------------------------+
  2. | INET6_ATON('::1') |
  3. +--------------------------------------+
  4. | 0x00000000000000000000000000000001 |
  5. +--------------------------------------+
  6. 1 row in set (0.00 sec)

INET6_NTOA()

INET6_NTOA() 函数的功能类似于 INET_NTOA(),但 INET6_NTOA() 还可以处理 IPv6 地址。

  1. SELECT INET6_NTOA(0x00000000000000000000000000000001);
  1. +------------------------------------------------+
  2. | INET6_NTOA(0x00000000000000000000000000000001) |
  3. +------------------------------------------------+
  4. | ::1 |
  5. +------------------------------------------------+
  6. 1 row in set (0.00 sec)

IS_IPV4()

IS_IPV4() 函数用于判断输入的参数是否为 IPv4 地址。

  1. SELECT IS_IPV4('127.0.0.1');
  1. +----------------------+
  2. | IS_IPV4('127.0.0.1') |
  3. +----------------------+
  4. | 1 |
  5. +----------------------+
  6. 1 row in set (0.00 sec)
  1. SELECT IS_IPV4('300.0.0.1');
  1. +----------------------+
  2. | IS_IPV4('300.0.0.1') |
  3. +----------------------+
  4. | 0 |
  5. +----------------------+
  6. 1 row in set (0.00 sec)

IS_IPV4_COMPAT()

IS_IPV4_COMPAT() 函数用于判断输入的参数是否为兼容 IPv4 的地址。

  1. SELECT IS_IPV4_COMPAT(INET6_ATON('::127.0.0.1'));
  1. +-------------------------------------------+
  2. | IS_IPV4_COMPAT(INET6_ATON('::127.0.0.1')) |
  3. +-------------------------------------------+
  4. | 1 |
  5. +-------------------------------------------+
  6. 1 row in set (0.00 sec)

IS_IPV4_MAPPED()

IS_IPV4_MAPPED() 函数用于判断输入的参数是否为 IPv4 映射的地址。

  1. SELECT IS_IPV4_MAPPED(INET6_ATON('::ffff:127.0.0.1'));
  1. +------------------------------------------------+
  2. | IS_IPV4_MAPPED(INET6_ATON('::ffff:127.0.0.1')) |
  3. +------------------------------------------------+
  4. | 1 |
  5. +------------------------------------------------+
  6. 1 row in set (0.00 sec)

IS_IPV6()

IS_IPV6() 函数用于判断输入的参数是否为 IPv6 地址。

  1. SELECT IS_IPV6('::1');
  1. +----------------+
  2. | IS_IPV6('::1') |
  3. +----------------+
  4. | 1 |
  5. +----------------+
  6. 1 row in set (0.00 sec)

IS_UUID()

IS_UUID() 函数用于判断输入的参数是否为 UUID

  1. SELECT IS_UUID('eb48c08c-eb71-11ee-bacf-5405db7aad56');
  1. +-------------------------------------------------+
  2. | IS_UUID('eb48c08c-eb71-11ee-bacf-5405db7aad56') |
  3. +-------------------------------------------------+
  4. | 1 |
  5. +-------------------------------------------------+
  6. 1 row in set (0.00 sec)

NAME_CONST()

函数 NAME_CONST() 用于命名列。建议使用列别名功能代替。

  1. SELECT NAME_CONST('column name', 'value') UNION ALL SELECT 'another value';
  1. +---------------+
  2. | column name |
  3. +---------------+
  4. | another value |
  5. | value |
  6. +---------------+
  7. 2 rows in set (0.00 sec)

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

  1. SELECT 'value' AS 'column name' UNION ALL SELECT 'another value';
  1. +---------------+
  2. | column name |
  3. +---------------+
  4. | value |
  5. | another value |
  6. +---------------+
  7. 2 rows in set (0.00 sec)

SLEEP()

SLEEP() 函数用于将查询暂停执行几秒。

  1. SELECT SLEEP(1.5);
  1. +------------+
  2. | SLEEP(1.5) |
  3. +------------+
  4. | 0 |
  5. +------------+
  6. 1 row in set (1.50 sec)

UUID()

UUID() 函数用于返回通用唯一标识符 (UUID) version 1。UUID 的定义可参考 RFC 4122

  1. SELECT UUID();
  1. +--------------------------------------+
  2. | UUID() |
  3. +--------------------------------------+
  4. | cb4d5ae6-eb6b-11ee-bacf-5405db7aad56 |
  5. +--------------------------------------+
  6. 1 row in set (0.00 sec)

另请参阅 UUID 最佳实践

UUID_TO_BIN

参见 BIN_TO_UUID()

VALUES()

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

  1. CREATE TABLE t1 (id INT PRIMARY KEY, c1 INT);
  2. Query OK, 0 rows affected (0.17 sec)
  3. INSERT INTO t1 VALUES (1,51),(2,52),(3,53),(4,54),(5,55);
  4. Query OK, 5 rows affected (0.01 sec)
  5. Records: 5 Duplicates: 0 Warnings: 0
  6. INSERT INTO t1 VALUES(2,22),(4,44) ON DUPLICATE KEY UPDATE c1=VALUES(id)+100;
  7. Query OK, 4 rows affected (0.01 sec)
  8. Records: 2 Duplicates: 2 Warnings: 0
  9. TABLE t1;
  10. +----+------+
  11. | id | c1 |
  12. +----+------+
  13. | 1 | 51 |
  14. | 2 | 102 |
  15. | 3 | 53 |
  16. | 4 | 104 |
  17. | 5 | 55 |
  18. +----+------+
  19. 5 rows in set (0.00 sec)

不支持的函数

函数名功能描述
UUID_SHORT()基于特定假设提供唯一的 UUID,目前这些假设在 TiDB 中不存在,详见 TiDB #4620