PHP-PHPとMYSQLの文字セットの問題


環境1:
(1) character_set_results = NULL
(2) character_set_client = UTF-8
(3) character_set_database = gbk
(4)PHPページはUTF-8として符号化
実行コード:
<span style="font-family:'Microsoft YaHei';">$str = "     2";

mysql_query("insert into tb_group(groupid,name,uplevelid,createpersonid) values(9,'{$str}',6,7)") or die(mysql_error());</span>

$strはgbkとして符号化されたデータベースに正常に挿入され、実行される.
<span style="font-family:'Microsoft YaHei';">$res = mysql_query("select * from tb_group where groupid = 9");

$result = mysql_fetch_array($res);

echo mb_detect_encoding($result["name"]);</span>

プログラム出力結果は「CP 936」;つまり取り出したデータはGBK符号化
プロセス全体の符号化変換:
ストレージ:
(1)データベースに挿入する$strはUTF-8符号化(PHPページはUTF-8符号化)
(2)insert実行後、サーバはcharacter_を読み出すset_Client値(UTF-8)は、insertからのデータがUTF-8であるか否かを判断し、もしそうであれば、データは対応するデータベースへ向かう
(3)データベースへのアクセス時には,データベースの符号化がGBKであり,insertからのデータがUTF-8であるため,サーバはまずそれをGBKに変換してからデータベースに格納する.
結果:元々UTF-8の$strをデータベースに格納してGBKに符号化
読み込み:
(1)GBKとして符号化された結果セットをデータベースから取り出す
(2)サーバ読み出しcharacter_set_results値(ここではNULL)は、NULLであるため、サーバはGBK符号化でクライアントに直接送信する
(3)クライアントは、GBKとして符号化された結果セットを受信する
まとめ:
(1)character_set_results = NULL        //character_set_resultsの役割は,サーバがクライアントに返す結果セットの符号化を指定することである.「UTF-8」などの特定の値がある場合、結果セットの元の符号化が何であるか(例えば「GBK」)にかかわらず、クライアントに送信される前にサーバによってUTF-8に転送され、送信される.ただし、値が「NULL」であればサーバは変換せず、GBKであればGBKで送信する.
(2) character_set_client = UTF-8        //character_set_クライアントの役割は,クライアントがサーバに送信するクエリー文字列の符号化を指定することである.クエリ文字列の符号化がこの値と異なる場合、データベースに挿入する値(GBK符号化の場合)は、UTF-8で解析されたデータの文字化けになります.上記の例は、データベースに挿入する$strがUTF-8符号化されているため、character_set_Clientの値もUTF-8で、両者は等しい
環境2
(1) character_set_results = NULL
(2) character_set_client = GBK
(3) character_set_database = gbk
(4)PHPページはUTF-8として符号化
実行コードは環境と同じです.
実行結果:挿入された値($strを指し、UTF-8符号化)は、GBKで解析された文字化けである.
解決:
方法1:$str=iconv(「UTF-8」,「GBK」,$str);//$strをUTF-8符号化からGBK符号化に変換
方法2:mysql_query("SET character_set_client = 'UTF-8'");//SET character_をset_Client値をUTF-8に設定
環境3:
(1) character_set_results = UTF-8
(2) character_set_client = UTF-8
(3) character_set_database = gbk
(4)PHPページはUTF-8として符号化
実行コードは環境と同じです
実行結果:挿入に成功しましたが、データベースから取り出された値はUTF-8符号化です(これらの値はデータベース内でGBK符号化されていますが)
理由:character_set_results=UTF-8//結果セットがクライアントに送信される前に、サーバはその値に基づいて結果セットを変換しました
注意:実際のエンコーディングでは、データベース接続に成功した後にmysql_を実行するのが一般的です.query(「SET NAMESが設定する符号化」)は、character_set_results,character_set_クライアントおよびcharacter_set_接続の値を統一して設定する
ここのcharacter_set_results,character_set_Clientは、それらの値が異なるため、character_について上述したいくつかの符号化問題について議論した.set_connectionは,実際のテストでは,その値が符号化にあまり影響を及ぼさなかったため,本稿では言及しなかったが,もちろんこれは個人的な結論であり,興味のある友人は自分でテストすることができる.
関連資料:http://dev.mysql.com/doc/refman/5.1/zh/charset.html#charset-database(10.3.6.文字セットと校正を接続)