PHPプロ!TIPS+

mysql_set_charset関数を使ってみる

mysql_set_charset関数はPHP-5.2.3から追加されたMySQLのクライアント側の文字コードまで設定することができる関数です。

バージョン4.1以降のMySQLを使用している場合、MySQLのデフォルト文字コードを修正するために、SET NAMES utf8とすることがよくあるかと思います。「SET NAMES utf8」というクエリを発行すると、MySQLサーバのcharacter_set_client、character_set_connection、character_set_resultという文字コードを指定することができます。

設定される変数の中にcharacter_set_clientというものがあるのですが、これはサーバに接続しているクライアントの文字コードをサーバ側で設定するためのものです。この変数を設定することで、サーバ側のクライアントの文字コードを設定することはできますが、クライアント側の文字コードは設定されません。

そのため、クライアントの文字コードに影響されるmysql_real_escape_string関数に対する設定を行うことができません。そのため、今まではMySQL自体のデフォルト文字コードを変更する必要がありました。ディストリビューション付属のパッケージでは大抵の場合は、latin1に設定されているので、ソースからインストールする必要がありました。

しかし、改良版のMySQLエクステンション(mysqli)ではmysqli_set_charset関数が存在しており、それによってクライアント側の文字コードと、サーバ側の文字コードの両方を設定することができました。PHP-5.2.3で追加されたmysql_set_charset関数もmysqli_set_charset関数と同じ動作をします。

では早速使用してみましょう。

<?php
$link 
mysql_connect("localhost""root");
mysql_select_db("test");

echo 
"default: " mysql_client_encoding() . "\n";

mysql_query("SET NAMES 'utf8'");
echo 
"SET NAMES utf8: " .  mysql_client_encoding(). "\n";

mysql_set_charset("utf8");
echo 
"mysql_set_charset: " mysql_client_encoding() . "\n";

この結果は以下のようになります。

default: latin1
SET NAMES utf8: latin1
mysql_set_charset: utf8

SET NAMESでは変更できなかったクライアントの文字コードを変更することができました。ではこれで、何がうれしいのかというと、sjis、jis、utf-16を使ったりくらいのもので、実用性は薄いかもしれません…。

文字のエスケープではまったときは、この関数を思い出してみると解決の糸口が見つかるかもしれません。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)