2017-06-28 14 views
0

最近、ロシア語の文字を扱うために、mysqlをlatin-1からutf-8に変更しなければなりませんでした。彼らはもともとは?????と表示されていました。テーブルでエンコーディングを使用する場合

また、データベースのいくつかのテーブルをutf8mb4に変更する必要がありました。私はもともとこれらをutf8に設定していましたが、これは特定の文字を処理するのに十分なビットがありませんでした。

プロダクションデータベースを変更する必要があり、特定のエンコードタイプの行の数か月後に問題が発生しないようにする必要があります。

私の質問はいつ私がテーブル上のエンコードを使用するのですか?

+1

意見に基づいて:私は通常、 'utf8mb4'と' utf8mb4_unicode_520_ci'を使用します。これにより照合順序が改善されます。 –

+0

いつでもmysqlに格納されているデータには1つの文字セットしか適用されないため、whenの質問は真です。単純なことに対する答え:アプリケーション内で使用する必要があるすべての文字を含む文字セットを使用します。 – Shadow

+0

私は同意するが、私は尋ねなければならなかった。 dbのすべてのテーブルをこのエンコーディングに変更すること、つまり既存のデータと出力に関する問題が懸念されていたと思います。 –

答えて

-1

複数の質問があります。

"???" latin1からutf8への変換が間違っている可能性があります。これでデータは失われました。これは '?'残っている。 SELECT HEX(...) ...は、あなたが入手したものが3F?)であることを確認して、何か役に立つものがあることを確認します。

Trouble with utf8 characters; what I see is not what I storedの「疑問符」を参照してください。

utf8mb4およびutf8キリル文字(ロシア語)を同じように扱うので、CHARACTER SETは「???」に関して問題ではありません。

データのオリジナルがある場合は、hereに3番目の項目が必要です。 - 「文字セットはlatin1に設定されていますが、utf8バイトが含まれています。それは私が2段階と呼ぶものですALTER

今後の問題を回避するため...私の最初のリンクの「ベストプラクティス」を参照してください。必要なものがヨーロッパ(ロシア語を含む)であれば、utf8またはutf8mb4で十分です。しかし、Emojiまたはすべての中国語をしたい場合は、utf8mb4で行ってください。

また、クライアントが使用している文字セットを指定する必要があります。これは一般的な省略であり、おそらく最初に問題の原因となったものの一部です。

関連する問題