その他の機能
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() | 指定した秒数スリープします。1 クラスターの場合、 SLEEP()関数には最大 300 秒のスリープ時間しかTiDB Cloudサーバーレスできないという制限があることに注意してください。 | 
UUID() | ユニバーサルユニーク識別子 (UUID) を返す | 
UUID_TO_BIN() | UUIDをテキスト形式からバイナリ形式に変換する | 
VALUES() | INSERT中に使用される値を定義します | 
任意の値()
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)
前の例では、列idが非集計であり、句GROUP BYに含まれていないため、TiDB は最初のSELECTステートメントに対してエラーを返します。この問題に対処するために、2 番目のSELECTクエリはANY_VALUE()使用して各グループから任意の値を取得し、 GROUP_CONCAT()使用して各グループ内の列idのすべての値を 1 つの文字列に連結します。このアプローチにより、非集計列の SQL モードを変更せずに、各グループから 1 つの値とグループのすべての値を取得できます。
BIN_TO_UUID()
BIN_TO_UUID()とUUID_TO_BIN()テキスト形式の UUID とバイナリ形式間の変換に使用できます。どちらの関数2 つの引数を受け入れます。
- 最初の引数は変換する値を指定します。
 - 2 番目の引数 (オプション) は、バイナリ形式でのフィールドの順序を制御します。
 
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()関数は、列のデフォルト値を取得するために使用されます。
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になります。
グループ化()
GROUP BY修飾子参照。
INET_ATON()
INET_ATON()関数は、ドット区切りの 4 進表記の 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 アドレスをドット区切りの 4 つの表記に変換します。
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()関数は、指定された引数が言語であるかどうかをテストします。
SELECT IS_UUID('eb48c08c-eb71-11ee-bacf-5405db7aad56');
+-------------------------------------------------+
| IS_UUID('eb48c08c-eb71-11ee-bacf-5405db7aad56') |
+-------------------------------------------------+
|                                               1 |
+-------------------------------------------------+
1 row in set (0.00 sec)
名前_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()関数は、指定された秒数の間クエリの実行を一時停止するために使用されます。
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
値()
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() | TiDB TiDB #4620には存在しない特定の仮定に基づいて一意のUUIDを提供します。 |