#MySQL データベースにクエリを実行するときに、PHP は中国語の文字化けをどのように解決しますか?
1. MySQL データベースのデフォルトのエンコーディングは UTF-8 です;
2. MySQL でテーブルを作成するときは、文字セットを UTF-8 に設定します;
3. PHP でデータをクエリする前に、データベースのエンコードを UTF-8 に設定します。
MySQL "SET NAMES x" 文字セットの問題分析
私は最近、BBT から投票システムを構築するためのトレーニングを受けました。システムコードは難しくありませんが、主に文字セットとエンコーディングの勉強に時間を費やしました。 MySQL と Apache システムのエンコーディング (文字セット) の問題により、私は頭を悩ませ、非常に苦しみました。インターネット上のこれらの問題に対する解決策は散在しており、一方的であり、そのほとんどは理由を説明せずに解決策を提供しています。そこで、後発者が再び寄り道をしないように、ここ数日で得たことをまとめておきます。この記事は、PHP の作成には少し役立ちます (これを読むと、ほとんどのスペース プロバイダーのサーバーで PHP プログラムを正常に表示する方法がわかります) が、ネットワーク サーバーの確立と設定にさらに役立ちます。
まず、MySQL の文字セットについて話しましょう。 Windows では、my.ini の 2 つのフィールド
# CLIENT SECTION [mysql] default-character-set=utf8 # SERVER SECTION [mysqld] default-character-set=utf8
を変更することで、データベースのデフォルトの文字セットを変更できます。 1 つ目はクライアントのデフォルトの文字セットで、2 つ目はサーバーのデフォルトの文字セットです。両方を utf8 に設定し、MySQL コマンド ライン クライアントで「show variebles like "character_set_%";」と入力すると、次の文字が表示されます:
character_set_client latin1 character_set_connection latin1 character_set_database utf8 character_set_results latin1 character_set_server utf8 character_set_system utf8
utf8 は上記の設定に従います。 設定を変更します。このとき、UTF-8を使用してPHPプログラムでデータベースからデータを読み込むと、「?????」などの文字化けが発生する可能性があります。長い間オンラインで検索した後、解決策は簡単です。データベースに接続した後、データを読み取る前に、まずクエリ「SET NAMES UTF8」、つまり PHP の
mysql_query("SET NAMES UTF8");
を実行すると、表示されます。 (データベース情報内の文字が正常である限り) は正常です。なぜこうなった? 「SET NAMES UTF8」というクエリは具体的に何をするのでしょうか?
MySQL コマンド ラインに移動して「SET NAMES UTF8;」と入力し、「show variables like "character_set_%";」を実行すると、変数「character_set_client」、「character_set_connection」、および「character_set_results」が元々は latin1 だった値がすべて utf8 に変更されており、これら 3 つの変数が問題を引き起こしていることがわかりました。マニュアルを参照してください。上記の文は次のとおりです:
SET character_set_client = utf8; SET character_set_results = utf8; SET character_set_connection = utf8;
これら 3 つの変数の機能を確認してください:
情報入力パス: クライアント→接続→サーバー;
情報出力パス: サーバー→接続→結果。
つまり、各パスでは文字セット エンコーディングを 3 回変更する必要があります。文字化けした出力を例にとると、サーバー内の utf8 データの場合、受信接続は latin1 に変換され、受信結果は latin1 に変換され、utf-8 ページで結果が再度変換されます。 latin1 と utf8 など、2 つの文字セットに互換性がない場合、変換プロセスは元に戻すことができず、破壊的なものになります。したがって、後戻りはできません。
ただし、「SET NAMES UTF8」の効果は一時的なものであり、MySQL は再起動後にデフォルトに戻ることをここで述べておく必要があります。
次に、サーバー上の MySQL の構成について説明します。データ送信のエンコーディングの一貫性を確保するために、データベースの読み取りと書き込みのたびに「SET NAMES UTF8」を追加する必要があるのではないでしょうか?これら 3 つの変数がデフォルトで必要な文字セットになるように MySQL を構成できますか?マニュアルにはそれが記載されておらず、オンラインで答えを見つけることができませんでした。したがって、サーバー構成の観点から、そのコード行を省略する方法はありません。
推奨チュートリアル: 「PHP」「MySQL チュートリアル」
以上がPHPを使用してMySQLデータベースの中国語の文字化けクエリを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。