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

Posted

技术标签:

【中文标题】不正确的字符串值:列的“\\xEF\\xBF\\xBD”【英文标题】:Incorrect string value: '\xEF\xBF\xBD' for column不正确的字符串值:列的“\xEF\xBF\xBD” 【发布时间】:2012-06-24 22:11:50 【问题描述】:

我有一张表需要处理各种字符。字符包括Ø、®等。

我已将表设置为 utf-8 作为默认排序规则,所有列都使用表默认值,但是当我尝试插入这些字符时出现错误:字符串值不正确:'\xEF\xBF\xBD' for column '第 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"

还有其他想法吗?

【问题讨论】:

如果您发布用于插入表格的 C# 代码可能会有所帮助。 这三个字符看起来几乎像UTF-8 byte order mark (BOM)。 添加了插入语句,不确定它有多大帮助,因为它是一个标准的插入语句,但如果它有帮助...... @stakx 似乎它可能是一个 BOM,来自en.wikibooks.org/wiki/Perl_Programming/Unicode_UTF-8 perl 编程维基书:“(U+FFFD 在 UTF-8 中编码为 EF BF BD。”,为什么 BOM 不是如果所有内容都已以 utf8 编码,则可以正确识别? hmm 有趣的是来自 MySQL 5.5 参考手册:“mysql 在输入文件的开头忽略 Unicode 字节顺序标记 (BOM) 字符。以前,它读取它们并将它们发送到服务器,导致语法错误。BOM 的存在不会导致 mysql 更改其默认字符集。为此,请使用诸如 --default-character-set=utf8 之类的选项调用 mysql。”。使用 charset=utf8 设置我的连接字符串会完成此操作吗?还是 --default-character-set 执行不同的操作? 【参考方案1】:

\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", "");

【讨论】:

信息来自亚马逊 - 所以很遗憾我无法更改它 - 看起来像是替换它。再次感谢埃利安 - 一旦我确认了这个作品,我会将问题标记为已回答。 它完成了我需要它做的事情(将信息添加到我的数据库以供使用),尽管我注意到它会导致一些误导性信息,例如如果我删除 ø,客户姓氏是拼写错误。似乎应该有更好的方法。但是感谢您提供适用于现在的 Elian 的解决方案。【参考方案2】:

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

【讨论】:

感谢您的示例-尽管有问题-如果只是替换了使用参数,什么会阻止 SQL 注入?另外,我将如何使用参数进行插入? 他们不只是被替换。 AddWithValue() 方法是强类型和重载的。在这种情况下name 是一个字符串,但它也可以是intboolDateTime。此代码将确保字符串被转义,并且所有其他类型的格式正确。因此,它将防止 SQL 注入漏洞。 谢谢,现在正在处理 - 无需提供插入示例,我找到了我正在处理的。【参考方案3】:

对于使用 php 遇到类似问题的人,请尝试使用函数 utf8_encode($string)。它只是工作!

【讨论】:

以上是关于不正确的字符串值:列的“\xEF\xBF\xBD”的主要内容,如果未能解决你的问题,请参考以下文章

日期时间格式无效:1366 字符串值不正确

设置 JTable 列的原型值(用于自动宽度计算)

将字符串插入 SQLAlchemy Unicode 列的正确方法

SQL:Null 列的计数不正确

Postgres 时间戳列的默认值设置未正确使用

如何正确使用表值函数?