vend/mysql-uuid

MySQL UUID转换器和格式化工具

2.0.0 2020-06-15 03:35 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:24:02 UTC


README

Build Status Scrutinizer Code Quality Code Coverage Latest Stable Version License

描述

这是一个用于在PHP中处理MySQL UUID的小型库。MySQL UUID是由MySQL中的UUID()命令返回的128位值,默认格式为传统的十六进制和连字符UUID字符串,如下所示

02fbfeee-02ff-11e4-9583-080027f3add4

直接使用此类值有几个问题

  • 字符串将最频繁变化的timestamp字段存储在开头(即它是小端序);直接使用此值将使写入遍布整个表空间和索引,破坏任何形式的局部性。我们希望字符串的最后一部分包含UUID值中最频繁变化的部分。
  • 字符串不能直接用于128位列,例如BINARY(16);直接存储字符串将占用大约37个字节,而不是16个,这会膨胀索引和行大小。

MySQL UUID是按照1997年10月由开放集团发布的"DCE 1.1: Remote Procedure Call"(附录A)CAE(通用应用环境)规范(文档编号C706)生成的。

为什么要这样做?

主要为了数据聚类。我们不希望单个缓冲池页面对插入操作承受过多压力(就像auto_increment列的情况一样),我们也不想将数据随机分布在整个索引/表中。

安装

通过composer安装。这就完成了。

支持的格式

此库使用pack()unpack()将MySQL UUID值转换为更适合作为数据库键使用的值。支持的格式有

  • 标准UUID字符串,带有连字符。
  • 十六进制UUID,与字符串UUID相同,但没有字段分隔符连字符 - 可能与MySQL的HEX()UNHEX()一起使用。
  • 二进制UUID,是16字节二进制字符串,仅包含底层的128位UUID值,没有任何格式化。

快速API示例

<?php

use MysqlUuid\Uuid;
use MysqlUuid\Formats\Binary;

$uuid = new Uuid('02fbfeee-02ff-11e4-9583-080027f3add4');

$hex       = $uuid->toFormat(new Hex());        // string: 02fbfeee02ff11e49583080027f3add4
$reordered = $uuid->toFormat(new Reordered());  // string: 080027f3-add4-11e4-9583-02ff02fbfeee
$binary    = $uuid->toFormat(new Binary());     // string: \x08\x00\x27\xf3\xad\xd4\x95\x83\x11\xe4\x02\xff\x02\xfb\xfe\xee

字段重排

字符串和十六进制

以下是默认MySQL产生的字符串UUID的构建方式。我们使用这种字段结构来处理常规的“字符串”格式和“十六进制”格式。

“破坏局部性”是什么意思?time_low是第一个字段,基本上将你的键随机分布到可能的ID空间中。

重排后的字符串

如果你使用“重排”格式,你将得到具有以下字段格式的UUID

请注意,我们保留了版本和变体字段的位置。这意味着如果你有从版本和变体字段获取信息的东西,或者执行像解析时间戳字段回ID之类的操作,则此格式对你不会向后兼容。理想情况下,我们会设置不同的版本或变体,但尚不清楚哪些值已被保留(例如,微软为其UUID分配了一个变体),如果我们选择了已经使用的变体,这仍会引起问题。

二进制

对于二进制UUID,我们始终重排字段,并且比重排字符串格式更激进。没有标准的方式来从16字节二进制值中读取变体/版本,也没有字段分隔符,所以我们更激进地重新排列字段(不需要保持4-2-2-2-6字节格式)