10.7 预览特性:UUID 数据类型

通用唯一标识符 (UUID) 在计算领域已经非常普遍。一个 128 位的值,具有文本表示形式,并通过规定多种版本类型来确保唯一性,使其成为一种理想的数据类型。

UUID 数据类型作为一项特性请求在 MDEV-4958 中存在多年、并缓慢积累投票和关注者之后,我们很高兴地宣布 UUID 数据类型的预览版。与 INET6 数据类型类似,它使用了 MariaDB 10.5 中的数据类型插件 API。

UUID 数据类型是什么样的?

CREATE TABLE t1 (id UUID)
INSERT INTO TABLE t1 VALUES ('123e4567-e89b-12d3-a456-426655440000')

因此,在很大程度上,它看起来像一个字符串。你可以 CAST(转换)到它

SELECT CAST('123e4567-e89b-12d3-a456-426655440000' AS UUID)
123e4567-e89b-12d3-a456-426655440000

如果你有 BINARY(16) 数据字符串,它们也可以被 CAST(转换)为 UUID

SELECT CAST(x'102030405000000000000000adcefeff' AS UUID)
10203040-5000-0000-0000-0000adcefeff

通过这些基本的转换规则,你可以使用以下方法将现有的 CHAR/VARCHAR/TEXT 十六进制文本或 BINARY/VARBINARY/BLOB 编码的数据迁移到 UUID:

CREATE TABLE t1 (id BINARY(16));
ALTER TABLE t1 MODIFY COLUMN id UUID;

这也适用于复制;主库/从库可以是这些不同的类型,并且它会进行转换。

像所有数据类型一样,你可以设置默认值

CREATE TABLE t1 (
c1 UUID DEFAULT 0x00000000000000000000000000000000,
c2 UUID DEFAULT 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
c3 UUID DEFAULT '00000000-0000-0000-0000-000000000000',
c4 UUID DEFAULT 'ffffffff-ffff-ffff-ffff-ffffffffffff',
c5 UUID DEFAULT CAST(X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' AS UUID)
);

同样,如果格式不正确,你会收到警告

SELECT CAST('longlive-that-bear-a456-426655440000' AS UUID);
NULL

SHOW WARNINGS;
Level	Code	Message
Warning	1292	Incorrect uuid value: 'longlive-that-bear-a456-426655440000'

该数据类型的元数据也是一个 uuid 类型的字符串。

$ mariadb --column-type-info --execute "SELECT UUID()"
Field   1:  `UUID()`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       STRING (type=uuid)
Collation:  utf8mb3_general_ci (33)
Length:     108
Max_length: 36
Decimals:   39
Flags:      


+--------------------------------------+
| UUID()                               |
+--------------------------------------+
| 3ca2cd9a-15c9-11ec-9351-3c58c2a5ca80 |
+--------------------------------------+

如何亲自尝试 10.7 UUID 数据类型预览版?

我们准备了三种方法供你尝试此特性。

Tarball 包

前往 Tarball 下载页面

容器

你可以运行名为 quay.io/mariadb-foundation/mariadb-dev:10.7-mdev-4958-uuid 的容器,其界面与 Docker Library mariadb 镜像相同。这里我使用了 podman 来运行容器,并在容器中运行 mariadb 命令行

$ podman run --rm -d -e MARIADB_USER=bob \
  -e MARIADB_PASSWORD=entry -e MARIADB_DATABASE=uuidtest \
  -e MARIADB_RANDOM_ROOT_PASSWORD=1 \
  --name mariadb-uuid \
   quay.io/mariadb-foundation/mariadb-devel:10.7-mdev-4958-uuid
feab2044def356e03e594e6604fed8f29037c3aafdd10bbcbcf82abca4866f74

$ podman exec -ti mariadb-uuid mariadb -u bob -pentry uuidtest
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.7.0-MariaDB-MDEV-4958-uuid mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [uuidtest]> create table uuidtest ( id uuid not null primary key default(uuid()));
Query OK, 0 rows affected (0.016 sec)

MariaDB [uuidtest]> insert into uuidtest values (),(),(),(),();
Query OK, 5 rows affected (0.020 sec)
Records: 5  Duplicates: 0  Warnings: 0

MariaDB [uuidtest]> select * from uuidtest;
+--------------------------------------+
| id                                   |
+--------------------------------------+
| fd08a402-16c0-11ec-a724-7e502e50dded |
| fd08a9f6-16c0-11ec-a724-7e502e50dded |
| fd08ab9f-16c0-11ec-a724-7e502e50dded |
| fd08abfe-16c0-11ec-a724-7e502e50dded |
| fd08ac3d-16c0-11ec-a724-7e502e50dded |
+--------------------------------------+
5 rows in set (0.001 sec)

Binder 在线 MariaDB Jupyter Notebook

通过 Binder,你可以在网页浏览器中获得一个完整的运行实例。请耐心等待链接加载,这需要一点时间。

欢迎反馈

如果你在此特性预览版中遇到任何问题、设计缺陷或不符合预期的边缘情况,请在 MDEV 项目上通过 JIRA 提交错误报告/特性请求,告知我们。欢迎在 Zulip 上讨论。