私たちの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.15
CentOS 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,
問題を解決するためにどのようなことを試すことができますか?
カラムタイプとは何ですか? – AbraCadaver
列はvarchar(100)です。私はBIGINTを試しましたが、範囲外のエラーがありました。 – brenjt
あなたがそれらをキャストしたり、計算したりしない限り、文字列であるのでうまくいくはずです。 – AbraCadaver