3

.Netコネクタ(6.5.4)でMysql(5.5.27)を使用していますが、データを挿入しようとすると、次のエラーが発生します。

Incorrect string value: '\xF3\xB6\xA5\x89f'...' for column 'STACK_TRACE' at row 1

私はすでにスタックオーバーフローについて十分に検索し、データベース、テーブル、および列の文字セットと照合を追跡してみました。

  • 'utf8''utf8_general_ci'
  • 'utf8''utf8_unicode_ci'
  • 'utf8mb4''utf8mb4_general_ci'
  • 'utf8mb4''utf8mb4_unicode_ci'

接続文字列に「charset=utf8」を正しく設定しました。

  • その特定のUnicode文字に何か問題がありますか?多くのAndroid携帯から収集されたデータを管理することはできません。
  • それはmysqlのバグですか?
4

3 に答える 3

13

以下の変更を行うことで、問題を解決しました。

  • 使用された";CharSet = utf8mb4;" 接続文字列で。私は以前にこれを逃しました。「utf8」を使用していました。
  • データベースのデフォルトの文字セット、テーブルのデフォルトの文字セット、およびすべての列の文字セットを「utf8mb4」に設定します
  • データベースのデフォルトの照合、テーブルのデフォルトの照合、およびすべての列の照合を「utf8mb4_unicode_ci」に設定します

@eggyalが言及しているように、列の文字セットと照合は重要です。すべてのデフォルト値を設定したので、将来、すべての新しい列を更新する必要はありません。

于 2012-12-26T16:18:34.263 に答える
3

バイト シーケンス\xF3\xB6\xA5\x89は、私用文字である文字 U+F6949 の有効な UTF-8 バイト シーケンスのようです。この文字は補助プレーンにあり、それを表すには 4 バイトの UTF-8 シーケンスが必要であることに注意してください。

MySQL ドキュメント 10.1.10Unicode サポートは、MySQL 5.5.3 より前では、文字セット "utf8" は "1 文字あたり 1 ~ 3 バイト" のみをサポートしていたことに注意しています。MySQL 5.5.27 を使用しているため (ご指摘ありがとうございます)、MySQL はこの文字を処理できますが、新しいエンコーディングを使用する必要がありますutf8mb4。 . utf8mb4照合のバリアントも使用します。また、「Unicode を使用してサーバーと通信する必要があるクライアント アプリケーションは、それに応じてクライアントの文字セットを設定する必要があります。たとえば、SET NAMES 'utf8'ステートメントを発行します。」

utf8mb4列も同様に設定することを忘れないでください。「列の文字列値が正しくありません...」というエラー メッセージは、これが問題である可能性を示唆しています。 MySQL バグ レポート #30131特殊文字を挿入する際の「不正な文字列値」エラー (1366)は、同様の状況のようです。最後のコメントは次のとおりです。「この問題は簡単に解決します。データベース、テーブル、および照合を utf8 に設定するだけでなく、列も忘れないでください。それが問題の原因です。私はラテン語でテーブルを作成し、次に切り替えます。 utf8 に変更しましたが、列も変更するのを忘れていました。」

JDBC 経由で UTF-8 を MySQL に挿入しようとすると、スタック オーバーフローの質問「文字列値が正しくありません」? 同様の問題についてのようです。

于 2012-12-14T08:31:16.800 に答える
0

ドキュメントから - utf8 という名前の文字セットは、1 文字あたり最大 3 バイトを使用し、BMP 文字のみを含みます。MySQL 5.5.3 の時点で、utf8mb4 文字セットは 1 文字あたり最大 4 バイトを使用し、補助文字をサポートしています...

utf8mb4 文字セット (4 バイト UTF-8 Unicode エンコーディング)

4 バイトの UTF を使用する必要がある場合は、テーブル フィールドを変更し、utf8mb4 charset を設定し、接続を設定しますSET NAMES utf8mb4

于 2012-12-14T08:19:57.453 に答える