データベース内の「Krakozyabry」または「より早く考える必要があったとき」

先日、私は愚かな状況に遭遇しました。 1つのWebプロジェクトを立ち上げ、すべてが機能し、コードが記述および補足され、データベースがいっぱいになりました。 開発はテストホストで行われ、変更がサーバーにアップロードされます。チェック全体はサイト自体に入り、すべてをテストすることになります。 突然、文字 "w"がサイトに表示されず、代わりに2つの無意味な文字であることがわかりました。



「そして」という文字でも同じことが起こりました。 すぐにサーバー上のDBMSにアクセスして、キリル文字の代わりに...固体の「詐欺師」を確認します。 しかし、ラテン語は普通に書かれています。



もちろん、誰もがエンコードの問題について考えていましたが、もちろんそうです。 詳細を見る...テーブルのエンコーディングはUTF-8、必要な列のエンコーディングはUTF-8、ページヘッダーのエンコーディングはUTF-8、ブラウザのエンコーディングはUTF-8です。 そしてもちろん、中間リンクは失敗しました、接続エンコーディングはcp1251です。 そして、すべては、テストおよび運用データベースサーバー設定のIDを検証しなかったからです。 愚かな間違いですが、データベース内のデータはすでにいっぱいであり、何らかの形でそれを返す必要があります。 可能なすべてのことを行った後、いくつかの興味深いsqlクエリ、メモ帳を使用したダンプ内のエンコーディングのシャーマニズムを持つメソッド、エラーなしで動作する1つのphpスクリプトが同じヒエログリフを返しました。 何かが助けにならず、何かが単に合わなかった。



私の決定は平凡ですが、ネットワークのオープンスペースで同様の決定は見つかりませんでした。

必要なテーブルを目的の形式に転送する小さなphpスクリプトを作成します。



<?php define('BD_HOST','localhost'); define('BD_PASS','password'); define('BD_LOGIN','login'); //   define('BD_FROM','bd1'); //  define('BD_IN','bd2'); //  $tables = array ( 'table1', 'table2', 'table3', 'table4', 'table5'); //    ,       ,     ( ,   ) foreach ($tables as $table) { mysql_connect(BD_HOST,BD_LOGIN,BD_PASS); mysql_select_db(BD_FROM); $query_select_from = "SELECT * FROM $table;"; $result = mysql_query($query_select_from); mysql_close(); //       mysql_connect(BD_HOST,BD_LOGIN,BD_PASS); mysql_select_db(BD_IN); mysql_query("set names utf8"); //  ,      ,       while ($t = mysql_fetch_assoc($result)) { $values = ''; $f = false; foreach($t as $val) { $p = ($f)?',':''; $f = true; $add = (is_int($val))?"$val":"'$val'"; $values.= "$p $add"; }; $insert_in = "INSERT $table VALUES($values)"; mysql_query($insert_in); //  ,     }; mysql_close(); // ,        . }; ?>
      
      







以上です。 このスクリプトは必要なことを正確に行い、数分で記述されたため、これをより柔軟で最適化できることに驚くかもしれません。



このスクリプトが誰かに役立つことを願っています。

ご清聴ありがとうございました。



UPD:



助けてくれたedogに感謝し、不要なデータベースクエリを削除しました。



All Articles