mysql:15789
From: <a2cf@xxxxxxxxxx>
Date: Wed, 11 Jul 2012 15:39:25 +0900
Subject: [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で運用したいと思っております。 皆様のアドバイスを頂ければ幸いです。 何とぞよろしくお願いいたします。
-> 15789 2012-07-11 15:39 [<a2cf@xxxxxxxxxx> ] PHPとutf8mb4 15793 2012-07-12 01:35 ┗[<gotou1213@xxxxxxxxx] 15797 2012-07-12 10:09 ┗[<a2cf@xxxxxxxxxx> ] 15798 2012-07-12 10:37 ┗[<gotou1213@xxxxxxxxx] 15799 2012-07-12 13:48 ┗[<a2cf@xxxxxxxxxx> ] 15800 2012-07-12 17:47 ┗[<gotou1213@xxxxxxxxx] 15801 2012-07-12 18:40 ┗[<a2cf@xxxxxxxxxx> ] 15802 2012-07-12 18:55 ┣[yoku ts <yoku0825@xx] 15805 2012-07-12 20:49 ┃┗[<a2cf@xxxxxxxxxx> ] 15806 2012-07-13 11:20 ┃ ┣[yoku ts <yoku0825@xx] 15807 2012-07-13 13:38 ┃ ┃┗[<a2cf@xxxxxxxxxx> ] 15808 2012-07-13 13:42 ┃ ┃ ┗[yoku ts <yoku0825@xx] 15810 2012-07-13 18:04 ┃ ┗[<a2cf@xxxxxxxxxx> ] 15803 2012-07-12 19:13 ┗[Tomohiro 'Tomo-p' KA] 15804 2012-07-12 20:49 ┗[<a2cf@xxxxxxxxxx> ]