問題の概要:
mysql データベースを含むサイトを latin1 から utf8 に変換しようとすると、文字セットがすべてシステム全体で utf8 であることを確認しているにもかかわらず、一部の特殊文字が正しく表示されません。
問題の詳細:
これは一般的な問題です。しかし、私は複雑さを増しているようです。
数年前、無知な開発者 (私) が、MySQL を使用してサイトを作成しました。一部のテーブルは、latin1_swedish_ci および utf8_general_ci でセットアップされました。すべての入力/表示は、iso-8859-1 文字セットのページを介して行われました。
ここで、このすべてのデータを utf-8 に変換し、最終的にエンコーディングを統一するというタスクがあります。ただし、両方のインスタンスで多くの特殊文字に問題があります (例: ü)。UTF-8 ページで文字が正しく表示されないようです。代わりに、mysql クエリ ブラウザで utf8 テーブルのデータを表示すると、正しく入力された utf8 の 'u' がいくつかの特殊文字として表示されますが、誤って latin1 'u' がページに表示されるはずのように表示されます。しかし、そうではありません。
私は多くのことを試しました:
- Percona スクリプト: https://github.com/rlowe/mysql_convert_charset
- col をバイナリに変換してから utf8 に変換する
- utf8 テーブルをラテン語に変換してから、上記のプロセスを繰り返します
データを修復するものはないようです。
データベース全体をダンプすることは、現在は巨大なデータベースであり、ダウンタイムが制限されているため、実際には実行可能なオプションではありません。
更新 (2013 年 10 月 22 日)
@deceze の提案を受け、http://kunststube.net/frontback/ に従ってすべてのコンテンツ エンコーディング領域を確認しました。latin1 でデータを渡したりエンコードしたりしている場所をいくつか見つけました。だから、私は今それをすべてUTF-8に変更しました。ただし、データはまだ特定のフィールドで正しく表示されていません。utf8 のテーブル (暗黙的なエンコーディングを持つ列はありません) では、field1 は latin1 です。テキストを正しく表示する次のコマンドを実行すると、これを確認できます。
テーブル WHERE id = 1 から convert(cast(convert(field1 using latin1) as binary) using utf8) を選択します
これにより、Hahnemühle が Hahnemühle に変換されます。
field2 では、データが別の (不明な) エンコーディングになっているようです。上記のクエリを field2 で使用すると、ハーネマーをハーネマーに変換します。http://dev.mysql.com/doc/refman/5.5/en/charset-charsets.htmlのすべての文字セットを調べて latin1 を置き換えましたが、データを正しく吐き出すものはないようです。