YII未能在Postgres 9.4中阅读BIGINT。静默转换为MAX_INT。适用于9.5

时间:2016-04-06 02:09:23

标签: php postgresql heroku yii2

我在DEV和PROD中有不同的数据库版本。 DEV正在使用Postgres 9.5,而PROD正在使用9.4版。它适用于DEV,但不适用于PROD。我只想读取BIGINT字段的值。它们默默地限于MAX_INT!我已经在模型规则中的'number'中设置了字段。我如何阅读正确的值?

哪些步骤会重现问题?

class KwController extends \yii\console\Controller {

  public function actionTest() {
    $accounts = Account::find()->all();
    foreach ($accounts as $account) {
      echo "$account->google_id\n";
      //echo $account->google_id.PHP_EOL;
      //printf("%s\n", $account->google_id);
    }
  }

class Account extends \yii\db\ActiveRecord
{
  public function rules()
  {
      return [
          [['google_id', 'bing_id'], 'number'],
          [['name'], 'string', 'max' => 255]
      ];
  }


dev=# \d account
                                  Table "public.account"
  Column   |          Type          |                      Modifiers
-----------+------------------------+------------------------------------------------------
 id        | integer                | not null default nextval('account_id_seq'::regclass)
 name      | character varying(255) |
 google_id | bigint                 |
 bing_id   | bigint                 |


prod=> \d account
                                  Table "public.account"
  Column   |          Type          |                      Modifiers
-----------+------------------------+------------------------------------------------------
 id        | integer                | not null default nextval('account_id_seq'::regclass)
 name      | character varying(255) |
 google_id | bigint                 |
 bing_id   | bigint                 |


dev=# select * from account;
 id |   name    | google_id  | bing_id
----+-----------+------------+---------
  1 | Test      | 1304682651 |
  2 | Account 2 | 2712796608 |


prod=> select * from account;
 id |   name    | google_id  | bing_id
----+-----------+------------+---------
  1 | Account 1 | 3797444208 |
  2 | Account 2 | 8817806877 |
  3 | Account 3 | 3199585540 |
  4 | Account 4 | 1596230720 |
  5 | Account 5 | 1389831585 |


$ /usr/sbin/postgres --version
postgres (PostgreSQL) 9.5.2


prod=> \c
psql (9.5.2, server 9.4.4)

预期结果是什么?

我希望输出为

3797444208
8817806877
3199585540
1596230720
1389831585

你得到了什么?

请注意,DEV的值大于MAX_INT,但它可以正常工作。每当PROD的值大于MAX_INT时,它只会打印MAX_INT。

$ yii kw/test
1304682651
2712796608


$ YII_ENV=prod yii kw/test
2147483647
2147483647
2147483647
1596230720
1389831585

其他信息

Yii 2.0.7,PHP 5.6.19,Windows / Cygwin(DEV),Heroku(PROD)

我还输入了一个bug,以防万一:https://github.com/yiisoft/yii2/issues/11286

1 个答案:

答案 0 :(得分:1)

我不得不使用这个

$accounts = Account::find()->select(['*', 'google_id' => 'cast(google_id as varchar)'])->all();

但只是在抗议下。我不喜欢它!

警告,如果您使用架构缓存,则可能必须先让它过期,然后才能尝试更改。

'enableSchemaCache' => true,