MySQLエンコーディングの修正と変更

Krakozyabryとの戦い MySQLエンコーディングの問題を解決するために非常に多くの人々が助けを求めているという事実のため、私は最も一般的なケースを「治療する」方法を説明する記事を書くことにしました。



この記事では、MySQLエンコーディングを最初に正しく構成する方法については説明していません(これについてはすでにかなり多く書かれています)。



エンコードが正しく構成されていないことの最悪な点は、多くの場合、問題を検出するのが難しいことです。一見すると、サイトが正常に機能していて問題がないように見えることがあります。



小さな余談。 Sypexビューアー



ある時点で、かさばるphpMyAdminに人を送ることにうんざりし、小さなユーティリティSypex Viewerが作成されました。 これは単一のPHPファイルであり、最新のWeb 2.0テクノロジーAJAX、JSONなどを使用しています。 作成中に設定された主なタスクは、最小の重み、および最大の利便性と速度です。 将来的には、サンプルにはスクリーンショットが含まれますが、phpMyAdminで同じアクションをすべて実行できます。



latin1のcp1251テーブルのデータ



おそらく最も人気のある問題。 データがcp1251(Windows-1251)でエンコードされ、テーブルにデフォルトのエンコードlatin1がある場合。 このような状況は、次の場合に発生します。



その結果、サイトではすべてが正常に見えますが、Sypex Viewerを見ると、ロシア語の文字は「krakozyabry」のように見えます(通常はユーザーによって呼び出されます)。







この記事では、既製のソリューションとして、無料のphpスクリプトSypex Dumperを使用してエンコードを変換するオプションの1つを検討します。

  1. [エクスポート]タブで、目的のテーブルを選択します。
  2. エンコードは自動でなければなりません(他のパラメーターは重要ではありません。たとえば、「エンコードを修正する前にダンプする」などのコメントを追加できます)。
  3. [実行]をクリックします。 これでバックアップができました(いずれの場合も、データベース変換を使用することをお勧めします)。
  4. 「インポート」タブに移動します
  5. 作成したばかりのバックアップファイルを選択します。
  6. cp1251エンコードを選択し、オプション「エンコードの修正」をチェックします。
  7. [実行]をクリックします。
  8. Sypex Viewerで、ロシア語の文字が正しく表示されることを確認します。






utf8のデータとテーブル、ただしlatin1接続エンコーディング



次に、より高度なケースを検討します。 UTF-8の流行により、最近人気が高まっています。 ソフトウェアの作成者は子孫をUTF-8に移行し始めましたが、ここではすべてが私たちが望むほどスムーズではありません。



この問題は主に、テーブルがUTF-8エンコード、UTF-8のデータを指定し、接続エンコードがデフォルトでlatin1に設定されている場合に発生します(典型的な例、vBulletin 4、configsに接続エンコード設定がありますが、デフォルト)。



その結果、データはUTF-8でMySQLに送信されますが、latin1接続のエンコードが指定されているため、MySQLはデータをlatin1からUTF-8に変換しようとします。 その結果、ロシア語の文字は次のようになります。







状況はより軽視されていますが、問題は最初の場合とほぼ同じように修正され、手順2でエンコードlatin1を選択する必要があり、手順6でutf8エンコードを選択する必要があります。



エンコーディングの変更



また、一般的な問題は、エンコードをcp1251からUTF-8に変換することです。 この手順を完了する前に、Sypex ViewerまたはphpMyAdminでロシア語の文字が正しく表示されていることを確認してください。そうでない場合は、まずエンコードを修正してください。

それで、再びSypex Dumperに行きます。

  1. [エクスポート]タブで、目的のテーブルを選択します。
  2. テーブルの変換先のエンコーディング(この場合はutf8)を設定します。
  3. [実行]をクリックします。
  4. 次に、「インポート」に進み、目的のファイルを選択します。
  5. utf8エンコーディングとオプション「エンコーディング修正」を設定します。
  6. [実行]をクリックします。
  7. これがUTF-8のすべてのテーブルです。 接続のエンコードを設定し、スクリプトとテンプレートをUTF-8に変換し、ヘッダーに正しいエンコードを設定する必要があることを忘れないでください。




接続エンコード



エンコードを修正した後、スクリプトが接続の正しいエンコードを使用していることを確認する必要があることを忘れないでください(原則として、これはすぐに表示され、接続に必要なエンコードなしでロシア文字が誤って表示されます)。 いくつかの場合、それは設定で設定され、いくつかの場合は自分で追加する必要があります。



ファイル検索を行って、mysql_connect(またはmysqli_connect)関数が呼び出される場所を見つける理由。 この行の後に、接続のエンコードを示す行を追加する必要があります。



mysql_query("SET NAMES 'cp1251'");
      
      







cp1251の代わりに、目的の接続エンコーディングを指定します。



コンドームの場合と同様に、変換をエンコードする前にバックアップすることを忘れないでください。必要なときよりも、必要なときにするほうがよいでしょう。



PS例の楽しいコンテンツを提供してくれたShortiksに感謝します。



All Articles