[前][次][番号順一覧][スレッド一覧]

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>   ]