問題は、SET NAMES 'utf8_persian_ci'
コマンドが無効だったことです(utf8_persion_ciは照合であり、エンコーディングではありません)。ターミナルで実行すると、エラーが表示されますUnknown character set: 'utf8_persian_ci'
。したがって、アプリケーションは、データを格納latin1
するときに文字セットを使用していました。MySQLは、入力をlatin1文字として解釈し、utf-8としてエンコードして保存しました。同様に、データが引き出されたとき、MySQLはそれをUTF-8からlatin1に、そして(願わくば、ほとんどの場合)あなたが与えた元のバイトに変換し直しました。
つまり、データベース内のすべてのデータが完全に台無しになっていますが、それはたまたま機能していました。
これを修正するには、行ったことを元に戻す必要があります。最も簡単な方法は、PHPを使用することです。
SET NAMES latin1;
- すべてのテーブルからすべてのテキストフィールドを選択します。
SET NAMES utf8;
- 変更されていない同じ文字列を使用して同じ行を更新します。
または、MySQL内でこれらの手順を実行することもできますが、MySQLはデータを特定の文字セットであると理解するため、注意が必要です。テキスト列をBLOBタイプに変更してから、utf8文字セットを使用してテキストタイプに戻す必要があります。MySQLドキュメントの下部にあるALTER TABLE
赤い「警告」というラベルの付いたセクションを参照してください。
これらのいずれかを実行すると、データベース列に格納されているバイトは、それらが主張する実際の文字セットになります。次に、将来行う可能性のあるPHPからのデータベースアクセスを常に使用するようにしてください。mysql_set_charset('utf8')
そうでなければ、あなたは再び物事を台無しにするでしょう。(単純なものは使用しないでくださいmysql_query('SET NAMES utf8')
!接続のリセットなど、latin1
知らないうちにリセットできる場合があります。mysql_set_charset()
必要に応じて文字セットを設定します。)
mysql_*
関数から切り替えて、PDO
代わりにPDOdsncharset=utf8
のパラメーターを使用するのが最適です。