この問題は、このサイトの参加者や他の多くの人々を悩ませています。
CHARACTER SET
の5つの主なケースをリストしました トラブル。
ベストプラクティス
今後は、CHARACTER SET utf8mb4
を使用するのが最適です。 およびCOLLATION utf8mb4_unicode_520_ci
。 (パイプラインには新しいバージョンのUnicode照合があります。)
utf8mb4
utf8
のスーパーセットです 絵文字や一部の中国語で必要な4バイトのutf8コードを処理するという点で。
MySQL以外では、「UTF-8」はすべてのサイズのエンコーディングを指します。したがって、MySQLのutf8mb4
と実質的に同じです。 、utf8
ではありません 。
以下では、これらのスペルと大文字を使用して、MySQLの内部と外部を区別しようとします。
すべきことの概要 行う
- エディタなどをUTF-8に設定します。
- HTMLフォームは
<form accept-charset="UTF-8">
のように開始する必要があります 。 - バイトをUTF-8としてエンコードします。
- クライアントで使用されているエンコーディングとしてUTF-8を確立します。
- 列/テーブルで
CHARACTER SET utf8mb4
を宣言します (SHOW CREATE TABLE
で確認してください 。) -
<meta charset=UTF-8>
HTMLの先頭に - 保存されたルーチンは、現在の文字セット/照合を取得します。再構築が必要な場合があります。
コンピューター言語の詳細 (およびその後続のセクション)
データをテストする
ツールまたはSELECT
を使用してデータを表示する そのようなクライアント、特にブラウザが多すぎると、誤ったエンコーディングを補正し、データベースが破損している場合でも正しいテキストを表示しようとします。したがって、英語以外のテキストを含むテーブルと列を選択して、実行してください
SELECT col, HEX(col) FROM tbl WHERE ...
正しく保存されたUTF-8のHEXは
になります- 空白の場合(任意の言語):
20
- 英語の場合:
4x
、5x
、6x
、または7x
- ほとんどの西ヨーロッパでは、アクセント付きの文字は
Cxyy
である必要があります - キリル文字、ヘブライ語、ペルシア語/アラビア語:
Dxyy
- ほとんどのアジア:
Exyyzz
- 絵文字と一部の中国語:
F0yyzzww
- 詳細a>
発生した問題の具体的な原因と修正
切り捨て テキスト(Se
Señor
の場合 ):
- 保存されるバイトはutf8mb4としてエンコードされません。これを修正してください。
- また、読み取り中の接続がUTF-8であることを確認してください。
ブラックダイヤモンド 疑問符付き(Se�or
Señor
の場合 );これらのケースの1つが存在します:
ケース1(元のバイトはではなかった UTF-8):
- 保存されるバイトはutf8としてエンコードされません。これを修正してください。
- 接続(または
SET NAMES
)INSERT
の場合 およびSELECT
utf8/utf8mb4ではありませんでした。これを修正してください。 - また、データベースの列が
CHARACTER SET utf8
であることを確認してください (またはutf8mb4)。
ケース2(元のバイトは UTF-8):
- 接続(または
SET NAMES
)SELECT
の場合 utf8/utf8mb4ではありませんでした。これを修正してください。 - また、データベースの列が
CHARACTER SET utf8
であることを確認してください (またはutf8mb4)。
黒のひし形は、ブラウザが<meta charset=UTF-8>
に設定されている場合にのみ発生します 。
質問マーク (ブラックダイヤモンドではなく、通常のもの)(Se?or
Señor
の場合 ):
- 格納されるバイトはutf8/utf8mb4としてエンコードされていません。これを修正してください。
- データベースの列が
CHARACTER SET utf8
ではありません (またはutf8mb4)。これを修正します。 (SHOW CREATE TABLE
を使用します 。) - また、読み取り中の接続がUTF-8であることを確認してください。
文字化け (Señor
Señor
の場合 ):(この説明はダブルエンコーディングにも適用されます 、必ずしも表示されるとは限りません。)
- 保存するバイトはUTF-8でエンコードする必要があります。これを修正してください。
INSERTing
時の接続 およびSELECTing
テキストはutf8またはutf8mb4を指定する必要があります。これを修正してください。- 列は
CHARACTER SET utf8
として宣言する必要があります (またはutf8mb4)。これを修正してください。 - HTMLは
<meta charset=UTF-8>
で始まる必要があります 。
データは正しいように見えても正しく並べ替えられない場合は、間違った照合を選択したか、ニーズに合った照合がないか、ダブルエンコーディングを使用しています。 。
ダブルエンコーディング SELECT .. HEX ..
を実行することで確認できます 上記。
é should come back C3A9, but instead shows C383C2A9
The Emoji 👽 should come back F09F91BD, but comes back C3B0C5B8E28098C2BD
つまり、16進数は本来の約2倍の長さです。これは、latin1(またはその他)からutf8に変換し、それらのバイトをlatin1であるかのように扱い、変換を繰り返すことによって発生します。並べ替え(および比較)は行われません。たとえば、文字列がSeñor
であるかのように並べ替えているため、正しく機能します。 。
可能な場合はデータを修正する
切り捨ての場合 および質問マーク 、データが失われます。
文字化けの場合 /ダブルエンコーディング 、...
ブラックダイヤモンドの場合 、...
修正 ここにリストされています。 (5つの異なる状況に対する5つの異なる修正。慎重に選択してください): http://mysql。 rjweb.org/doc.php/charcoll#fixes_for_various_cases