PDO::mysql_client_encodingが 無くてSQLで発行すると不便なので実装してみた。

PDO::mysql_set_charset($charsetname)
PDO::mysql_client_encoding()
PDO::mysql_select_db($dbname)

使い方
  $dbh->mysql_set_charset('utf8');
  echo $dbh->mysql_client_encoding();

同じことをsqlで発行するには
  $dbh->exec('SET CHARACTER SET utf8 ');
  show variables like 'character_set_client' で Value列を取得

SQLレベルでPDOに実装をまねるなら PDOクラスを継承するといい。
もし、外部から値を受け取る場合は、
その際は、外部から値を受け付けないようにSQLインジェクション対策が必要だろう。
SHOW CHARACTER SETを使うと一覧がとれるので、その中と照合して、設定するようにすれば、よい。

今回は、PDO_MysqlのCソースレベルで対応した。
PHP_ME , PHP_METHOD の PHP_をZEND_にするようにとヘルプにはあったが、
・名前が嫌い、銘銘方法がきにくわない(企業名だし)
・他のPDOが使っていない
ということで今回は使うのは避けた。

有効桁の低い+中途半端なスクリプト言語に期待しても意味がないし、
わざわざ、PDO Cソースレベルので改造は、
コンパイルなどの手間がかかるので
素直に、適当な関数を作るか、PDOを継承したクラスにスクリプトコードで実装するほうが現実的だろう。


「実行結果」
sql: mysql_client_encoding: latin1
 get_class :PDO
 is_a($dbh ,'PDO') :true
 is_a($dbh ,'PDO_MYSQL') :false
 $dbh instanceof PDO_MYSQL :false
 PDO::ATTR_DRIVER_NAME  :mysql
 PDO::ATTR_SERVER_VERSION  :5.1.31-community
 PDO::ATTR_CLIENT_VERSION  :5.0.67

check encoding
 mysql_client_encoding: latin1
 set utf8 :true
 mysql_client_encoding: utf8

mysql_select_db true

» 続きを読む