2017-03-15 18 views
2

私たちのmysqlデータベースに64ビットのFacebook IDを保存しています。私がデータベーステーブルを見るとき、値は32ビットです。私はPDO接続でLaravelを使用しています。ダンプアウトされた場合の値は、バインディングで正しいです。一度実行されると、それらはDBで異なります。私はMariaDBからMySQLにデータベースを変更しようとしました。すべてがPDOであることを指しています。PDOで64ビットから32ビットに変換される整数

これは私のローカル開発マシンでは全く同じバージョンのPHP 7.0.15を使用しています。開発やローカルでエラーは発生しません。

MySQLとPHPは64ビット版です。私は問題を解決するのに役立つ何かを見つけることができませんでした。

2013年のthis bug reportは、私の問題をはっきりと示していますが、解決されたようです。

LaravelのConnectionクラスでは、bindValuesメソッドがデータ型をチェックしています。

public function bindValues($statement, $bindings) 
{ 
    foreach ($bindings as $key => $value) { 
     dump($value); // Value is correct at this point. 
     $statement->bindValue(
      is_string($key) ? $key : $key + 1, $value, 
      is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR 
     ); 
    } 
} 

私もちょうどPDO::PARAM_STRをする第三のparamを設定しようとしたが、それは動作を変更しませんでした。

サーバは

PDOおよびMySQL拡張、MySQLは5.7.17あり、PHP 7.0.15CentOS Linux 7.3.1611ある

php70w-pdo.x86_64     7.0.15-1.w7 @webtatic 
php70w-mysql.x86_64     7.0.15-1.w7 @webtatic 

テーブルはUTF-8 UnicodeエンコーディングとInnoDBと照合がSQL接続であるutf8_unicode_ci

あります:

'charset' => 'utf8', 
'collation' => 'utf8_unicode_ci', 
'prefix' => '', 
'strict' => true, 
'modes' => ['STRICT_TRANS_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','ERROR_FOR_DIVISION_BY_ZERO','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'], 
'engine' => null, 

問題を解決するためにどのようなことを試すことができますか?

+2

カラムタイプとは何ですか? – AbraCadaver

+0

列はvarchar(100)です。私はBIGINTを試しましたが、範囲外のエラーがありました。 – brenjt

+0

あなたがそれらをキャストしたり、計算したりしない限り、文字列であるのでうまくいくはずです。 – AbraCadaver

答えて

0

解決策が見つかりました。私たちのサーバーは、通常のphp70-mysqlドライバを使用していましたが、ネイティブドライバではありませんphp70-mysqlnd。一度我々は整数が保存されたことを更新しました。

関連する問題