ちと確認したいことがあったので。
もっそメモ書きなので、適宜脳内保管しつつ読んでくださりませ。
とりあえず
set global long_query_time = 0;
set global slow_query_log = 'on';
して、MySQL側に渡っているものを覗いてみようかなぁとか画策。
create table test(
a int,
b varbinary(16),
c blob,
d DOUBLE,
e datetime
);
という、大変にやる気のあふれたテーブルを作成w
以下
<?php
$o = new PDO('mysql:dbname=test;host=localhost', ユーザアカウント, ぱすわぁど);
$o->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
を前提に。
$sql = 'INSERT INTO test(a,b,c,d,e) VALUES(:a, :b, :c, :d, :e);';
$pp = $o->prepare($sql);
// intをintで
$pp->bindValue(':a', 1, PDO::PARAM_INT);
$pp->execute();
// intをSTRで
$pp->bindValue(':a', 2, PDO::PARAM_STR);
$pp->execute();
// intをLOBで
$pp->bindValue(':a', 3, PDO::PDO::PARAM_LOB);
$pp->execute();
ってテストしたら
Invalid parameter number: number of bound variables does not match number of tokens
って怒らりた。パラメタ数、結構まじめにチェックしてやがんの。てっきり「無指定はNULL」とかぬるめな事考えてたのに。
気を取り直して。
$sql = 'INSERT INTO test(a) VALUES(:a);';
$pp = $o->prepare($sql);
// intをintで
$pp->bindValue(':a', 1, PDO::PARAM_INT);
$pp->execute();
// intをSTRで
$pp->bindValue(':a', 2, PDO::PARAM_STR);
$pp->execute();
// intをLOBで
$pp->bindValue(':a', 3, PDO::PDO::PARAM_LOB);
$pp->execute();
あんまり取り直してない気もするけど気にしない。
結果。
INSERT INTO test(a) VALUES(1);
INSERT INTO test(a) VALUES('2');
INSERT INTO test(a) VALUES(3);
まぁ予想通り。
select * from test;
1 |
NULL |
NULL |
NULL |
NULL |
2 |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
NULL |
NULL |
こっちもまぁ。
お次。
$sql = 'INSERT INTO test(b) VALUES(:b);';
$pp = $o->prepare($sql);
// intをintで
$pp->bindValue(':b', 1, PDO::PARAM_INT);
$pp->execute();
// intをSTRで
$pp->bindValue(':b', 2, PDO::PARAM_STR);
$pp->execute();
// intをLOBで
$pp->bindValue(':b', 3, PDO::PARAM_LOB);
$pp->execute();
コメント直しミス。気にスンナ。
INSERT INTO test(b) VALUES(1);
INSERT INTO test(b) VALUES('2');
INSERT INTO test(b) VALUES(3);
こっちもおおむね。…PARAM_LOBがシングルクォートで囲ってくれてないのが、不思議っちゃぁ不思議。LOBって文字列の系譜ぢゃないのかしらん?
select * from test;
1 |
NULL |
NULL |
NULL |
NULL |
2 |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
NULL |
NULL |
NULL |
1 |
NULL |
NULL |
NULL |
NULL |
2 |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
NULL |
お次は小数点。
$sql = 'INSERT INTO test(a, d) VALUES(:a, :d);';
$pp = $o->prepare($sql);
// intをintで
$pp->bindValue(':a', 1.1, PDO::PARAM_INT);
$pp->bindValue(':d', 1.1, PDO::PARAM_INT);
$pp->execute();
// intをSTRで
$pp->bindValue(':a', 2.2, PDO::PARAM_STR);
$pp->bindValue(':d', 2.2, PDO::PARAM_STR);
$pp->execute();
// intをLOBで
$pp->bindValue(':a', 3.3, PDO::PARAM_LOB);
$pp->bindValue(':d', 3.3, PDO::PARAM_LOB);
$pp->execute();
INSERT INTO test(a,d) VALUES(1.1, 1.1);
INSERT INTO test(a,d) VALUES('2.2', '2.2');
INSERT INTO test(a,d) VALUES(3.3, 3.3);
select * from test;
1 |
NULL |
NULL |
1.1 |
NULL |
2 |
NULL |
NULL |
2.2 |
NULL |
3 |
NULL |
NULL |
3.3 |
NULL |
そ〜だよね〜的な状況。
少しひねる。
$sql = 'INSERT INTO test(a) VALUES(:a);';
$pp = $o->prepare($sql);
// intをintで
$pp->bindValue(':a', 'a', PDO::PARAM_INT);
$pp->execute();
// intをSTRで
$pp->bindValue(':a', 'b', PDO::PARAM_STR);
$pp->execute();
// intをLOBで
$pp->bindValue(':a', 'c', PDO::PARAM_LOB);
$pp->execute();
エラーでるかしらん? むりしゃりintにするかしらん?
INSERT INTO test(a) VALUES('a');
INSERT INTO test(a) VALUES('b');
INSERT INTO test(a) VALUES('c');
…そ〜きたか。ある意味素直だ。
select * from test;
0 |
NULL |
NULL |
NULL |
NULL |
0 |
NULL |
NULL |
NULL |
NULL |
0 |
NULL |
NULL |
NULL |
NULL |
まぁ値が0になるのは当然だらう。
お次は「無指定」のケース。気になるしねぇ。
// あと「無指定」の場合の挙動も確認
$sql = 'INSERT INTO test(a,b,c,d,e) VALUES(:a, :b, :c, :d, :e);';
$pp = $o->prepare($sql);
//
$pp->bindValue(':a', 1);
$pp->bindValue(':b', 2);
$pp->bindValue(':c', 3);
$pp->bindValue(':d', 4);
$pp->bindValue(':e', 5);
$pp->execute();
//
$pp->bindValue(':a', 'a');
$pp->bindValue(':b', 'b');
$pp->bindValue(':c', 'c');
$pp->bindValue(':d', 'd');
$pp->bindValue(':e', 'e');
$pp->execute();
INSERT INTO test(a,b,c,d,e) VALUES('1', '2', '3', '4', '5');
INSERT INTO test(a,b,c,d,e) VALUES('a', 'b', 'c', 'd', 'e');
どうも「文字列でふぉ」らしい。確かどこかにンなこと書いてあったよねぇ、的な。
1 |
2 |
3 |
4 |
0000-00-00 00:00:00 |
0 |
b |
c |
0 |
0000-00-00 00:00:00 |
ほんのりとクラックっぽいことを。
$sql = 'INSERT INTO test(b) VALUES(:b);';
$pp = $o->prepare($sql);
//
$pp->bindValue(':b', "'", PDO::PARAM_INT);
$pp->execute();
//
$pp->bindValue(':b', '"', PDO::PARAM_INT);
$pp->execute();
//
$pp->bindValue(':b', '--', PDO::PARAM_INT);
$pp->execute();
INSERT INTO test(b) VALUES('\'');
INSERT INTO test(b) VALUES('\"');
INSERT INTO test(b) VALUES('--');
INSERT INTO test(b) VALUES(';');
まぁめげませんねぇ当然です。
select * from test;
NULL |
' |
NULL |
NULL |
NULL |
NULL |
" |
NULL |
NULL |
NULL |
NULL |
-- |
NULL |
NULL |
NULL |
NULL |
; |
NULL |
NULL |
NULL |
最後、今ひとつ不明なのが「PARAM_STMT」。
いくつか情報はチラ見したんだけど、今ひとつ。情報ある人いらっしゃったら教えてくださいませ ノ
さて…本格的にdata_clumpのほうで対応していかないとねぇこの辺。
追記
そういや「使える文字種別」ってどのくらいまでなんだろう?
ハイフン(-)とアンダースコア(_)、できればイコール(=)とアット(@)あたりくらいまでいけるといいんだけどなぁ。
そのうち実験してみませう。