15

さまざまな文字を処理するために必要なテーブルがあります。文字には、Ø、® などがあります。

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

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

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

なぜまだエラーが表示されるのか途方に暮れています。.net コネクタまたは MySQL のセットアップで何か見逃したことはありますか?

- 編集 -

私の(新しい)C#挿入ステートメントは次のようになります。

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"

他のアイデアはありますか?

4

3 に答える 3

32

\xEF\xBF\xBDUnicode 文字の UTF-8 エンコーディングですU+FFFD。これは「置換文字」とも呼ばれる特殊な文字です。特別なユニコード文字に関するウィキペディアのページからの引用:

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

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

データを修正できず、実際に入力に無効な文字が含まれている場合は、置換文字を削除できます。

lines[n] = lines[n].Replace("\xFFFD", "");
于 2012-06-22T18:56:41.350 に答える
3

Mattmanser の言うとおりです。クエリ内でパラメータを直接連結して SQL クエリを作成しないでください。パラメータ化されたクエリの例は次のとおりです。

string lastname = "Doe";
double height = 6.1;
DateTime date = new DateTime(1978,4,18);

var connection = new MySqlConnection(connStr);

try
{
    connection.Open();

    var command = new MySqlCommand(
        "SELECT * FROM tblPerson WHERE LastName = @Name AND Height > @Height AND BirthDate < @BirthDate", connection);

    command.Parameters.AddWithValue("@Name", lastname);
    command.Parameters.AddWithValue("@Height", height);
    command.Parameters.AddWithValue("@Name", birthDate);

    MySqlDataReader reader = command.ExecuteReader();
    ...
}
finally
{
    connection.Close();
}
于 2012-06-22T16:22:15.300 に答える
0

PHP を使用して同様の問題を抱えている人は、機能を試してくださいutf8_encode($string)。それはうまくいきます!

于 2015-08-25T14:04:05.617 に答える