vend /mysql-uuid
MySQL UUID转换器和格式化工具
Requires
- php: >=5.4.0
Requires (Dev)
- phpunit/phpunit: 4.1.*
This package is not auto-updated.
Last update: 2024-09-14 16:24:02 UTC
README
描述
这是一个用于在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字节格式)