0

次のような文字列があります。

絵文字が6つ連続

ここで、アプリがこの文字列を utf8 mysql データベース列に押し込むと、MySQL CLI では次のようになります。

文字列表現

私が選択した場合、convert(mystring using utfmb4)それはまだこのように見えます。

を使用して16進数にするselect hex(mystring) from mytable;と、次のようになります。

C3A2CB9CE282ACC3AFC2B8C28FC3B0C5B8C592CB86C3B0C5B8C592C5A0C3B0C5B8C592C281C3B0C5B8E280A1C2ACC3B0C5B8E280A1C2A7

ここで、その絵文字の波が含まれる文字列を見つけたいとしましょう。さて、波の絵文字の 16 進数は ですF09F8C8A。しかしF09F8C8A、上のヘックスにはないため、次のようなものselect * from mytable where hex(mystring) like '%F09F8C8A%';は機能しません。

助言がありますか?

4

1 に答える 1

1

私はそれを「二重符号化」と呼んでいます。あなたのクライアントは、latin1 文字を取得していると主張しましたが、MySQL には utf8 であるべきだと伝えたため、データベースでは 3 バイトの utf8 文字が 6 バイトに変換されました。

テーブル内のクライアントとデータの両方を修正する必要があります。 このリンクで説明しています: http://mysql.rjweb.org/doc.php/charcoll (申し訳ありませんが、問題を解決する方法の簡単な要約はありません。)問題修正.

于 2015-02-23T23:46:13.450 に答える