首页 > 解决方案 > CakePHP 3 - MySQL 'BIGINT' 字段在实体中未正确处理

问题描述

我有一个存储 MAC 地址的数据库。关于如何在 MySQL 数据库中存储 MAC 地址有很多讨论,我决定将其存储为无符号 BIGINT 以每行节省几个字节并实现更快的搜索。

这会很好用,除了当我从表中检索实体时,实体中的 mac 地址被限制为 2147483647,即 32 位系统的 PHP MAX_INT 值。因此,如果 MAC 地址超过 2147483647(99% 的地址都会发生这种情况),则 MAC 地址将不正确。

似乎在从数据库到实体的过程中的某个地方,值被解析为 int,这会破坏这些值。

有没有办法避免这种情况?是否可以强制实体属性为字符串而不是 int?

标签: mysqlcakephpentitycakephp-3.0biginteger

解决方案


转换发生在类型层 ( \Cake\Database\Type) 中,它是由查询对象在获取行时触发的。

默认情况下,大整数映射到\Cake\Database\Type\IntegerType. 如果您需要在 32 位系统上运行它,那么您可以例如将biginteger类型重新映射为\Cake\Database\Type\StringType. 在你的config/bootstrap.php

Type::map('biginteger', \Cake\Database\Type\StringType::class);

也可以看看


推荐阅读