MariaDB+PHPにて
PHPでDB上のデータを大量に処理するプログラムを書いていて、おかしな現象に出くわした。
1万件+42万件+43万件のjoinで、必要なもののみ取り出して、updateをかけるという手作業ではやる気にならない処理なので、サクッと書いてぶん回すしかない…。
ローカルでmysqlモニタを使用してSQLを叩くと、問題なく結果が返ってくる。
でもって、サーバ上で実行すると、結果がEmpty…。
あれれ?
試しに、phpmyadmin上でSQLだけ叩いてみる。
ローカルと同じ結果になる。
何かがおかしい。
:
:
$mysqli = new mysqli("localhost",$username,$password);
if($mysqli->connect_error){
print('<p>データベースへの接続に失敗しました</p>'.$mysqli->connect_error);
exit();
}
$mysqli->select_db($dbname);
$mysqli->set_charset("utf-8");
$sql="SELECT bill.bill_id,bill_item.bill_item_id,bill_item_detail.bill_item_detail_id,
bill.billing_id,bill.bill_month,bill.bill_date,bill.deposit_receive_date
FROM `bill_item_detail`
join bill_item on bill_item_detail.bill_item_id=bill_item.bill_item_id
join bill on bill.bill_id=bill_item.bill_id
WHERE `bill_item_detail`.`name` LIKE '繰越残高' AND
:
:
order by bill.bill_date";
$result = $mysqli->query($sql);
テーブル3つをjoinして、特定の条件のデータを拾い出すだけのことなのに…。
仕方なく、var_dump($result)で確認してみるが、サーバ上では、やはり0件となってしまう…。
条件をなしにして実行してみると、問題なく返ってくる。
ということは、WHERE句に問題有り。
少しずつ条件を増やしてみる。
name LIKE '〜' を入れた段階でEmptyとなる。
試しに、LIKE '%'で試すと結果が出てくるので、文字コード関連っぽい。
やっと気づいた
ここまでテストして、やっと気づいた。
$mysqli->set_charset("utf-8");
問題は、ここだ!
正しくは、以下のように書く必要が合った。
$mysqli->set_charset("utf8");
そう、「-」が余分だった。
ちょうど、このコードを書く前に、HTMLを書いていて、charset=UTF-8
と書いていていた…。
ああぁ。情けない。
こんな凡ミスをするというのが情けない。
しかし、同じ文字コードを表すのに、この表記の差は何とか統一して欲しい。
もしくは、Aliasでどちらでも機能するようにして欲しい…。
いったい、このミスを見つけるのに、どれだけ時間がかかったものか…。
という戒めの意味を込めて、記録しておく…。
この後、無事実行して80分ほどで書き換えが完了したので、まあ無事終わってはいるのだが…。
このミスを見つけるのに、30分以上脳味噌フル回転で作業して…。
疲れたゎ。
コメント
コメントを投稿
励みになりますので、簡単で良いので一言くださいませ。