sql >> データベース >  >> RDS >> Mysql

utf8を使用するかどうか-MySQLおよびPHPの文字エンコードの問題

    問題は、SET NAMES 'utf8_persian_ci' コマンドが無効でした (utf8_persion_ciは照合エンコーディングではありません )。ターミナルで実行すると、エラーUnknown character set: 'utf8_persian_ci'が表示されます。 。したがって、アプリケーションが保存された データは、latin1を使用していました キャラクターセット。 MySQLは、入力をlatin1文字として解釈し、utf-8としてエンコードして保存しました。同様に、データがプルバックされたとき、MySQLはデータをUTF-8からlatin1に変換し、(できればほとんどの場合)元のバイトに変換しました。

    つまり、データベース内のすべてのデータが完全に台無しになっていますが、たまたま機能していました。

    これを修正するには、行ったことを元に戻す必要があります。最も簡単な方法はPHPを使用することです:

    1. SET NAMES latin1;
    2. すべてのテーブルからすべてのテキストフィールドを選択します。
    3. SET NAMES utf8;
    4. 変更されていない同じ文字列を使用して同じ行を更新します。

    または、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 のパラメーター 。



    1. ストリームを使用してSQLServer(C#)の行を挿入または更新できますか?

    2. OracleテーブルのExcelワークシートへのエクスポート

    3. MySQLでデフォルトの制約を追加する方法

    4. SqlParameterの名前/値コンストラクターが0をnullとして扱うのはなぜですか?