我有一个表需要处理各种字符。字符包括Ø、®等。
我已将表设置为 utf-8 作为默认排序规则,所有列都使用表默认值,但是当我尝试插入这些字符时,出现错误:“buyerName”列的字符串值不正确:“\xEF\xBF\xBD”在第 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"
还有其他想法吗?
\xEF\xBF\xBD
是 unicode 字符 U+FFFD
的 UTF-8 编码。这是一个特殊字符,也称为“替换字符”。来自维基百科页面关于特殊 unicode 字符的引用:
替换字符 �(通常是带有白色问号的黑色菱形)是 Unicode 标准中 Specials 表中代码点 U+FFFD 处的符号。它用于指示系统无法将数据流解码为正确符号时出现的问题。当字体不包含字符时最常见,但当数据无效且不匹配任何字符时也会出现:
看来您的数据源包含损坏的数据。您也可能尝试使用错误的编码来读取数据。线条从哪里来?
如果您无法修复数据,并且您的输入确实包含无效字符,您可以删除替换字符:
lines[n] = lines[n].Replace("\xFFFD", "");
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();
}
对于那些使用 PHP 遇到类似问题的人,请尝试使用该功能
utf8_encode($string)
。它只是有效!
由于数据来自 Amazon,因此可能会以 utf8mb4 而不是 utf8 的形式到达。第一个可以存储 4 个字节,另一个最多可以存储 3 个字节。这可能会导致替换字符。表情符号或其他字符可能会给 utf8 带来麻烦。 在 MySQL 中 utf8 等于 utf8mb3。
当我的网站编码是 utf-u 并且我尝试以 CP-1250 字符串形式发送(以 listdir 词典为例)时,我遇到了一些问题。 我认为你必须发送像网站一样编码的字符串。