恥知らずのウェブエンジニア -web engineer, shameless

これは一歩を踏み出すことができない者たちのブログ

phpからmysqlに接続する際のデフォルト文字コードについて

PHPフレームワークでcodeigniter,fuelphpなど使っているプロジェクトをnew relicで見てみると毎回DB接続の度にSET NAMES ~~~という文字コードを設定するクエリを毎回発行していました。

別にこれだけでどうってことはないのですが、毎接続時に発行されているし、なんか目障りだったので発行しないようにしたくなりました。

SET NAMES を発行している箇所

codeigniter * mysqliでは、SET NAMES ~~~を発行しているのは下記のようです。 CodeIgniter/mysqli_driver.php at 9e17059bf8d277058d1de23390e388b5fa0cc26a · bcit-ci/CodeIgniter · GitHub

対象のプロジェクトではmysql文字コードUTF-8を使っており、my.cnfにもそのように設定していました。

なので、そもそもこれしなくていいんじゃね?ってことで試しに、mysqli_driver.phpを継承したクラスを作り、set_charset()コメントアウトしてみました。 そうするとSET NAMES ~~~の消えて、挙動も問題なさそうでした。

とある環境のみ文字化け

で、よしよしと他の環境にも反映を行っていった所、ある環境のみ文字化けをしてしまいました。 文字化け具合的にlatinっぽい文字化けでした。

ライブラリによってデフォルト文字コードの扱いが違う

諸々調べるとPHPが使っているライブラリによってデフォルトの文字コードに違いがあるようでした。

PHP: Mysqlnd - Manual

MySQL :: MySQL PHP API :: 2.4 Choosing a library

PHP: どのライブラリを選ぶか - Manual

ライブラリ デフォルトの文字コード
mysqlnd サーバーのデフォルト文字コード
libmysql ビルド時の文字コード(デフォルトではlatin1)

文字化けしているサーバーがlibmysqlを使われていたので文字化けしていたの原因のようです。

対応としては、

これらあたりでいけそうです。

細かいとこですが、できるだけクエリは少なくしたいということで!