読者です 読者をやめる 読者になる 読者になる

PDO使って、MySQLに日本語データ突っ込んだら、文字化けした。

こんにちは。
PDO使って、MySQLに日本語データ突っ込んだら、文字化けして、困ってました。

PHPのバージョンが5.3.6以上の場合は
こんな書き方でいいです。

$pdo = new PDO(mysql:host=host;dbname=dbname;charset=utf8,'user','password');
$sql = 'SELECT * FROM test_tables';
$stmt = $pdo->query($sql);

PHPのバージョンが5.3.6未満の場合は

$pdo = new PDO(mysql:host=host;dbname=dbname,'user','password');
$sql = 'SELECT * FROM test_tables';
$stmt = $pdo->query('SET NAMES utf8');
$stmt = $pdo->query($sql);

がいいです。
SET NAMES 文字コードについては以下に詳しい説明がありましたので、そちらを参照ください。
MySQL :: MySQL 4.1 リファレンスマニュアル :: 9.3.6 接続のキャラクタセットおよび照合順序

ただし、SET NAMESを使った場合に発生する例外もあるようなので、
基本的にPHPのバージョンをできるだけ新しくしておくのがいいかもしれないですね。

参考記事:libmysqlclientを使うプログラムはset namesをutf8であっても使ってはいけない | へぼい日記


PHPの接続方法を詳しく知りたい場合は以下の記事を参考にされるといいと思います。
PHPでデータベースに接続するときのまとめ - Qiita [キータ]

下の書き方ですが、現状のCodeは問題ありなので、使用しないでください。

ただ、セキュリティ的に問題ありなので、下の書き方がおすすめです。
参考記事:PHP, PDOでMySQL接続時の文字コード設定 » beginsprite log

$pdo = new PDO(mysql:host=host;dbname=dbname,'user','password',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET 'utf8' "));
$sql = 'SELECT * FROM test_tables';
$stmt = $pdo->query($sql);


参考1:PDOでmysqlに日本語つっこんだら文字化けして困ったけど解決した - プログラムメモ
参考2:PHPのPDOメモ | Blog