- ベストアンサー
PDOで全てSTRING型で取得?MySQL側で自動変換される?
- PDOを利用してprepareとbindValueでINSERTする際、型指定してもexecute()時に全ての値は文字列として扱われる。
- データベースの各カラムの型は無視され、全て文字列としてINSERTされる。
- 数値を含むデータをSELECTすると、数値も文字列として取得される。MySQL側では文字列として挿入され、数値に変換されることはない。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>$stmt->bindValue(:id, $id, PDO::PARAM_INT); >のように型を指定する意味ってなんなのでしょうか? mysqlを利用する限りたぶん意味ないですね (すくなくとも私の環境ではPHP側でキャストはしてくれないようです) PDO自体必ずしもmysqlを前提としていないので別のsqlやmysqlのバージョンによっては 有効な場合もあるのではないでしょうか? ただしprepare処理さえしてあればインジェクション対策にはなるので 文字列から型変換される場合も問題ないとおもいますけどね
その他の回答 (2)
- mpro-gram
- ベストアンサー率74% (170/228)
limit ? offset ? に数値を入れるときだけは、必ず、bindValueでPDO::PARAM_INT の型指定必須です。 ここだけは、 "1" と入れると、syntax error になるので。 それ以外の所では、既に回答があるように、暗黙の型変換があるので、ほぼ、PDO::PARAM_STRで問題ありません。
お礼
ありがとうございます。 LIMITとOFFSETはINTを指定するのですね。 覚えておきます。助かりました!
- yambejp
- ベストアンサー率51% (3827/7415)
>MySQL側ではカラムの型をINTやFROATとして定義しても数値を文字列として挿入するとMySQL側も文字列として扱うのですか?それとも数値に変換されて挿入されますか? MySQLでは暗黙の型変換をします たとえば SELECT '1'+'2'; とすれば3を返してくれます もちろんデータ投入するときはテーブルで宣言されている型で当然入力されます http://dev.mysql.com/doc/refman/5.1-olh/ja/type-conversion.html
お礼
ありがとうございます。 であればわざわざ $stmt->bindValue(:id, $id, PDO::PARAM_INT); のように型を指定する意味ってなんなのでしょうか? どうせexecute()で文字列として挿入されてしまい、MySQL側で暗黙的に型変換されて挿入されるのならPDO::PARAM_INTを指定する意味がよくわかりません。 この辺を見ても結論が出ていない?ような書き方をしています…。 http://blog.a-way-out.net/blog/2013/12/15/pdo-prepare-statement-numeric-literal/ http://blog.a-way-out.net/blog/2013/12/18/pdo-prepare-statement-numeric-literal-part2/ あと型変換にはいろいろ問題も多いようですね。 http://www.tokumaru.org/d/20090924.html#p01
お礼
再度のご回答、ありがとうございます。 あまり意味はないのですね…。 たしかにPDOはMySQLだけじゃないですもんね。 一応問題なく動作していますので気にせずに使っていこうと思います。