5

問題の概要:

mysql データベースを含むサイトを latin1 から utf8 に変換しようとすると、文字セットがすべてシステム全体で utf8 であることを確認しているにもかかわらず、一部の特殊文字が正しく表示されません。

問題の詳細:

これは一般的な問題です。しかし、私は複雑さを増しているようです。

数年前、無知な開発者 (私) が、MySQL を使用してサイトを作成しました。一部のテーブルは、latin1_swedish_ci および utf8_general_ci でセットアップされました。すべての入力/表示は、iso-8859-1 文字セットのページを介して行われました。

ここで、このすべてのデータを utf-8 に変換し、最終的にエンコーディングを統一するというタスクがあります。ただし、両方のインスタンスで多くの特殊文字に問題があります (例: ü)。UTF-8 ページで文字が正しく表示されないようです。代わりに、mysql クエリ ブラウザで utf8 テーブルのデータを表示すると、正しく入力された utf8 の 'u' がいくつかの特殊文字として表示されますが、誤って latin1 'u' がページに表示されるはずのように表示されます。しかし、そうではありません。

私は多くのことを試しました:

  1. Percona スクリプト: https://github.com/rlowe/mysql_convert_charset
  2. col をバイナリに変換してから utf8 に変換する
  3. 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 を置き換えましたが、データを正しく吐き出すものはないようです。

4

3 に答える 3

5

latin1列を に設定し、他の列を に設定することutf8は、MySQL ではまったく問題ありません。ここで解決する問題はありません。この charset パラメータは、データが内部でどのように保存されるかに影響を与えるだけです。もちろん、たとえば「漢字」をlatin1列に格納できないことも意味します。しかし、そこに「Latin-1 文字」を格納しているだけだとすれば、それで問題ありません。

MySQL には、一般に接続エンコーディングと呼ばれるものがあります。これは、PHP (または他の場所) から送信されたテキストのエンコーディングと、MySQL からデータを取得するときに返されるエンコーディングを MySQL に伝えます。列の文字セット、「入力接続エンコーディング」、および「出力接続エンコーディング」はすべて異なるものである可能性があり、MySQL は必要に応じてオンザフライでエンコーディングを変換します。

したがって、これまで正しい接続エンコーディングを使用しており、データがデータベースに適切に保存されており、Latin-1 列に非 Latin-1 文字を保存しようとしていないと仮定すると、列を更新するために必要なことはすべてです。 UTF-8 への文字セットは次のとおりです。

ALTER TABLE table MODIFY column TEXT [...] CHARACTER SET utf8;
于 2013-10-21T14:32:34.407 に答える
3

ページに表示する前に文字列に utf8_encode を適用すると、「グリフ」文字 (�) を取り除くことができます。

于 2013-12-16T22:17:07.340 に答える