mysql 不正确的字符串值:列的“\xEF\xBF\xBD”

dw1jzc5e  于 2022-11-28  发布在  Mysql
关注(0)|答案(4)|浏览(451)

我有一个表,我需要处理各种字符。字符包括Ø,®等。
我已经将我的表设置为utf-8作为默认排序规则,所有列都使用表默认值,但是当我尝试插入这些字符时,我得到错误:不正确的字符串值:'\xEF\xBF\xBD'用于第1行的列“buyerName”
我的连接字符串定义为

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"

还有别的主意吗?

bpsygsoo

bpsygsoo1#

\xEF\xBF\xBD是Unicode字符U+FFFD的UTF-8编码。这是一个特殊字符,也称为“替换字符”。the wikipedia page about the special unicode characters的引号:
替换字符�(通常是一个带白色问号的黑色菱形)是Unicode标准中Specials表中U+FFFD码位处的一个符号。它用于指示系统无法将数据流解码为正确符号时出现的问题。它最常见于字体不包含字符时,但也会在数据无效且不匹配任何字符时出现:
因此,您的数据源似乎包含损坏的数据。也可能是您试图使用错误的编码读取数据。这些行是从哪里来的?
如果无法修复数据,并且输入的内容确实包含无效字符,则可以删除替换字符:

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

gg58donl2#

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();
}
jexiocij

jexiocij3#

对于那些在使用PHP时遇到类似问题的人,请尝试函数utf8_encode($string)。它确实有效!

qij5mzcb

qij5mzcb4#

我有这个问题,当我的网站编码是utf-u,我试图发送CP-1250字符串形式(由listdir字典采取的例子).我认为你必须发送字符串编码像网站.

相关问题