Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将大型(UUID)作为MySQL表主键处理的最佳方法_Php_Mysql_Hex_Decimal - Fatal编程技术网

Php 将大型(UUID)作为MySQL表主键处理的最佳方法

Php 将大型(UUID)作为MySQL表主键处理的最佳方法,php,mysql,hex,decimal,Php,Mysql,Hex,Decimal,我有一个UUID字符串,我想用它作为MySQL表的主键,UUID是一个32个字符的十六进制字符串(去掉“-”字符之后)。由于在数据库中最好使用数字列(int)作为主键,因此我想将其转换为整数,但不确定处理它的最佳方法 由于字符串的大小(即uuid='a822ff2bff02461db45ddcd10a2de0c2'),是否需要将其拆分为多个“子字符串” 目前我正在32位体系结构上运行PHP,因此在PHP中转换它将无法工作,因为PHP_INT_MAX size(MAX 0xFFFFFFFF)。我怀

我有一个UUID字符串,我想用它作为MySQL表的主键,UUID是一个32个字符的十六进制字符串(去掉“-”字符之后)。由于在数据库中最好使用数字列(int)作为主键,因此我想将其转换为整数,但不确定处理它的最佳方法

  • 由于字符串的大小(即uuid='a822ff2bff02461db45ddcd10a2de0c2'),是否需要将其拆分为多个“子字符串”
  • 目前我正在32位体系结构上运行PHP,因此在PHP中转换它将无法工作,因为PHP_INT_MAX size(MAX 0xFFFFFFFF)。我怀疑MySQL也会受到同样的限制
  • 我不喜欢使用多个主键来解决这个问题,我宁愿使用字符串表示法,尽管这不是首选方法

  • 我可能认为这一切都是错误的,我并不反对阅读文档,因此可以接受示例或建议阅读作为响应。

    使用字符串类型,而不是整数。只有解决了问题才更好


    如果您真正关心查找速度,请使用合成(自动递增)主键。您可以在UUID列上放置一个唯一约束,并且只使用它一次来查找随后用于联接等的合成键。

    对于大多数情况,最好将UUID/GUID存储为
    二进制(16)
    。请参阅以下相关问题:


    转换可以(而且可能应该)在MySQL而不是PHP中完成,因此,您使用的是32位PHP客户端还是64位并不重要(双关语:p)

    这也取决于存储引擎。TokuDB应该处理所有这些问题。

    还要注意的是,这个id字段将用于连接和选择。我在过去的项目中使用过字符串,我相信(在生产中)只会说几百万条记录是一个高数字,所以我不认为这是一个大的性能问题(使用字符串),我不太确定使用字符串和数字字段会对性能造成多大的影响。基于大小,我不完全确定合成主键在数百万条记录(比如1000万条记录)的情况下是否有利。因此,您的意思是,没有真正的方法可以轻松地将其打包/存储在数字表示中,我的选项是字符串和带有合成自动递增键的字符串。在它成为问题之前,它不是问题。生产质量数据库(包括mysql)有非常聪明的索引算法来处理字符串查询。如果您还不关心性能,那么为什么在最初的问题中要把头撞在最大整数大小的墙上?当然,您可以将其打包/存储为整数(可能使用多字段PK,您说您不喜欢(不确定为什么)),但为什么要麻烦呢,如果它不能解决现实世界中的问题,那么就要承担未来的维护开销?我喜欢@Hazzit给出的更好的答案。用那个,听起来正是我想要的。GUID/UUID不是由我生成的,它是从第三方源提取的。它是唯一的,可以作为主键使用@保罗:我也非常感谢你们的快速回复,我已经向你们两位表示感谢。感谢您在这些答案中提供的帮助。@Hazzit-您知道在MySQLi中将UUID作为字符串绑定到bind_param方法并将其指向二进制(16)字段是否合法吗?我很难确定我是否需要先做任何转换。