2012年7月11日

[mysql 15789] PHPとutf8mb4

藤田と申します。
いつも参考にさせていただいております。

長い質問で申し訳ございません。
PHPからutf8mb4として4バイトのUTF-8を扱う環境を作りたいと思っています。

【環境】
・CentOS5.8

・PHP5.3.3(標準RPM版) (スクリプトは全てUTF-8で統一)
・MySQL5.5.24(Red Hat&Oracle Linux5(x86,32-bit),RPM版)
(MySQLサーバの文字コードは全てutf8mb4で統一)


【my.cnf】
--------
[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
--------


●上記のような環境でmysqlクライアントからは以下のように表示されています。
> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+


●ここでPHPからmysqli関数を使って接続し、「show variables like 'character_set%'」を実行すると
以下のようになります。
--------
character_set_client => 'latin1'
character_set_connection => 'latin1'
character_set_database => 'utf8mb4'
character_set_filesystem => 'binary'
character_set_results => 'latin1'
character_set_server => 'utf8mb4'
character_set_system => 'utf8'
character_sets_dir => '/usr/share/mysql/charsets/'
--------
→この状態でinsertを実行すると、DBに入った全角文字は全てラテン文字等に文字化けします。


●次にPHPから$mysqli->set_charset('utf8');を実行してから、「show variables like 'character_set%'」を
実行すると以下のようになります。
--------
character_set_client => 'utf8'
character_set_connection => 'utf8'
character_set_database => 'utf8mb4'
character_set_filesystem => 'binary'
character_set_results => 'utf8'
character_set_server => 'utf8mb4'
character_set_system => 'utf8'
character_sets_dir => '/usr/share/mysql/charsets/'
--------
→この状態でinsertを実行すると、BMP領域の文字は全て問題ないですが、
4バイトUTF-8文字が「????」となってしまいます。(4つの?)


●次にPHPから$mysqli->set_charset('utf8mb4');を実行すると以下のエラーが発生しました。
($mysqli->errorより)
--------
Can't initialize character set utf8mb4 (path: /usr/share/mysql/charsets/)]
--------
→/usr/share/mysql/charsets/Index.xmlファイルを見ても
utf8に関する記述はありますがutf8mb4については記述がないように見えます。


●最後に[mysqld]にskip-character-set-client-handshakeをセットしてから
PHPでは$mysqli->set_charset('utf8mb4');を行わずにlatin1のままでinsertをすると
BMP領域の文字も4バイトUTF-8文字も全て正常にDBに書き込まれ、
PHPからのselectでも正常に読み出すことができました。


上記のような状況なのですが、このskip-character-set-client-handshakeをセットして
latin1のまま接続するというのは正しい方法なのでしょうか?
なお、PHPもDBもメンテナンス上の理由から標準のRPMで運用したいと思っております。
皆様のアドバイスを頂ければ幸いです。


何とぞよろしくお願いいたします。

投稿者 xml-rpc : 2012年7月11日 15:39
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/111245
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。