問題は、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文字セットのテキストタイプに。 ALTER TABLE
赤で「警告」とラベル付けされたMySQLドキュメント
。
これらのいずれかを実行すると、データベース列に格納されているバイトは、それらが主張する実際の文字セットになります。次に、常に mysql_set_charset('utf8')
将来行う可能性のあるPHPからのデータベースアクセスで!そうでなければ、あなたは再び物事を台無しにするでしょう。 (単純なmysql_query('SET NAMES utf8')
を使用しないでください。 ! これをlatin1
にリセットできるコーナーケース(接続のリセットなど)があります あなたの知らないうちに。 mysql_set_charset()
必要に応じて文字セットを設定します。)
mysql_*
から切り替えた場合に最適です 関数と使用されるPDO
代わりにcharset=utf8
を使用します PDOdsn
のパラメーター 。