PR

 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を使ったりくらいのもので、実用性は薄いかもしれません…。

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



(アシアル 森川穣)


この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。