【问题标题】:CakePHP 3 - MySQL 'BIGINT' field not processed correctly in entityCakePHP 3 - MySQL 'BIGINT' 字段在实体中未正确处理
【发布时间】:2019-07-30 12:11:22
【问题描述】:

我有一个存储 MAC 地址的数据库。 quite some discussion 介绍了如何在 MySQL 数据库中存储 MAC 地址,我决定将其存储为无符号 BIGINT 以每行节省几个字节并实现更快的搜索。

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

似乎在从数据库到实体的某个过程中,值被解析为 int,从而破坏了值。

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

【问题讨论】:

    标签: mysql cakephp entity cakephp-3.0 biginteger


    【解决方案1】:

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

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

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

    另见

    【讨论】:

    • 这很酷,很快就会尝试。据您所知,重新映射biginteger 会有副作用吗?例如。它是否在内部使用了可能会损坏的地方?
    • @Roberto 一个副作用当然是您将字符串传递给数据库,因此您最终会在查询中使用字符串文字,而不是整数。在大多数情况下,SQL 优化器应该能够很好地处理这个问题,但是如果您没有正确验证您的数据,那么非数字字符串可能会进入您的查询。现在可能还有更多我没有想到的东西,但我认为任何东西都不应该真正打破,至少不是核心,插件可能是一个不同的故事。
    • 对此进行了测试,似乎运行良好。只要我记得在例如时使用字符串设置新值而不是数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多