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が使っているライブラリによってデフォルトの文字コードに違いがあるようでした。
MySQL :: MySQL PHP API :: 2.4 Choosing a library
ライブラリ | デフォルトの文字コード |
---|---|
mysqlnd | サーバーのデフォルト文字コード |
libmysql | ビルド時の文字コード(デフォルトではlatin1) |
文字化けしているサーバーがlibmysqlを使われていたので文字化けしていたの原因のようです。
対応としては、
- mysqlndに変更する
- mysqli_optionsで文字コードを設定(
SET NAMES~~
なしで文字コードを設定される) PHP: mysqli::options - Manual
これらあたりでいけそうです。
細かいとこですが、できるだけクエリは少なくしたいということで!