0

私がそれを挿入しているmysqlテーブル(fooと呼びましょう)はlatin1文字でエンコードされています(コマンドで表示されますHow do I see what character set a MySQL database / table / column is?)および私のデータベースは後に次の結果を持っています変数を表示:

| character_set_client                    | latin1                                                                                    |
| character_set_connection                | latin1                                                                                    |
| character_set_database                  | latin1

foo には、varchar(255) col に foo® という文字列を格納したエントリがあり、それを 16 進数で表示すると、utf8 (666F6FC2AE) でエンコードされていることがわかります。mysql プロンプトから選択クエリを実行すると、foo® と表示されます。ただし、latin1 666F6FAE でエンコードされた同じ文字列を挿入すると、同じ mysql コマンド プロンプトで選択を実行すると、foo が表示されます。latin1 テーブルに utf8 でエンコードされたデータがあるのはなぜですか? また、latin1 でエンコードされたデータをテーブルに挿入できないのはなぜですか?

4

1 に答える 1

0

コマンド ライン クライアントは、表示/入力/出力に UTF-8 を使用しているようです。666F6FC2AElatin-1 列の UTF-8 でエンコードされた値ではなく、"foo®" の latin-1 コードです。これをデータベースから取得すると、CLI は latin-1 データを UTF-8 として解釈し、「foo®」を表示します。

説明する:

  • CLI は UTF-8 で動作します
  • CLI で「foo®」と入力すると、66 6F 6F C2AE
  • データベース接続は latin-1 に設定されています
  • データベースは入力を latin-1 として解釈し、「foo®」を保存したいと考えています
  • 列のエンコーディングは latin-1 です。問題ありません。データベースには「foo®」が格納されています。
  • データベースからデータをフェッチすると、すべてラテン 1 で返されます。66 6F 6F C2 AE
  • CLI はこれを UTF-8 として解釈し、「foo®」を表示します。

utf8クライアントは UTF-8 を送信するため、接続エンコーディングを に設定する必要があります。それか、Latin-1 で動作するように CLI を説得してください。

于 2012-11-14T16:50:33.170 に答える