1. ホーム
  2. c#

[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column

2022-02-08 05:06:05

質問事項

様々な文字を処理する必要があるテーブルがあります。その文字とは、Ø、® などです。

テーブルの照合順序をデフォルトのutf-8に設定し、すべての列でテーブルのデフォルトを使用するようにしましたが、これらの文字を挿入しようとするとエラーが発生します。Incorrect string value: '\xEFxBFxBD' for column 'buyerName' at row 1

私の接続文字列は次のように定義されています。

string mySqlConn = "server="+server+";user="+username+";database="+database+";port="+port+";password="+password+";charset=utf8;";

なぜまだエラーが出るのか、途方に暮れています。.netコネクタ、またはMySQLのセットアップのどちらかで何かを見逃してしまったのでしょうか?

--編集--

私の(新しい)C#のinsert文は次のようなものです。

MySqlCommand insert = new MySqlCommand( "INSERT INTO fulfilled_Shipments_Data " +
     "(amazonOrderId,merchantOrderId,shipmentId,shipmentItemId,"+
     "amazonOrderItemId,merchantOrderItemId,purchaseDate,"+ ...

      VALUES (@amazonOrderId,@merchantOrderId,@shipmentId,@shipmentItemId,"+
      "@amazonOrderItemId,@merchantOrderItemId,@purchaseDate,"+ 
      "paymentsDate,shipmentDate,reportingDate,buyerEmail,buyerName,"+ ...


       insert.Parameters.AddWithValue("@amazonorderId",lines[0]);
       insert.Parameters.AddWithValue("@merchantOrderId",lines[1]); 
       insert.Parameters.AddWithValue("@shipmentId",lines[2]);
       insert.Parameters.AddWithValue("@shipmentItemId",lines[3]);
       insert.Parameters.AddWithValue("@amazonOrderItemId",lines[4]);
       insert.Parameters.AddWithValue("@merchantOrderItemId",lines[5]);
       insert.Parameters.AddWithValue("@purchaseDate",lines[6]);
       insert.Parameters.AddWithValue("@paymentsDate",lines[7]);

 insert.ExecuteNonQuery();

これがパラメトリックステートメントの正しい使用方法だと仮定すると、まだエラーが発生します。

 "Incorrect string value: '\xEF\xBF\xBD' for column 'buyerName' at row 1"

他に何かアイデアはありますか?

解決方法は?

\xEF\xBF\xBD は、ユニコード文字のUTF-8エンコーディング U+FFFD . これは特殊文字で、「置換文字」とも呼ばれます。引用元 unicodeの特殊文字に関するwikipediaのページ :

<ブロッククオート

置換文字�(黒い菱形に白いクエスチョンマークが多い)は、ユニコード標準では特殊文字表のコードポイントU+FFFDにある記号です。これは、システムがデータのストリームを正しいシンボルにデコードできない場合に、問題を示すために使用されます。これは、フォントが文字を含んでいない場合によく見られますが、データが無効でどの文字とも一致しない場合にも見られます。

つまり、あなたのデータソースには破損したデータが含まれているようです。また、間違ったエンコーディングでデータを読み込もうとした可能性もあります。この行はどこから来たのでしょうか?

もしデータを修正できず、入力に本当に無効な文字が含まれているのなら、置換文字を削除すればよいでしょう。

lines[n] = lines[n].Replace("\xFFFD", "");