【发布时间】:2015-06-09 11:48:11
【问题描述】:
我有这个 sql:
从 productcode = @code 的产品中选择 productid
并且@code 是一个参数,它的值是ABCÊ,但它与ABC 匹配,在Visual Studio 中调试它显示在快速观察中。数据库有Latin1_General_CI_AS 作为排序规则。数据库中的字段类型是nvarchar(50)
那么当我将它与ABCÊ 进行比较时,为什么会返回包含 productcode = 'ABC' 的数据行?
我在我的短信select 1 where 'ABC' = 'ABCÊ' 中输入了这个,它没有返回 1,这确实:选择 1 where 'ABC' = 'ABC'
那么它在我的代码中吗?带有 utf 或编码的东西?
编辑 c#代码:
SqlCommand comGetProd = new SqlCommand(@"SELECT ProductID FROM PRODUCTS WHERE (ProductCode = @name)");
comGetProd.Parameters.AddWithValue("name", "ABCÊ");
编辑 15-6-2015
按照@Oskar Sjöberg 的建议缩小了问题范围。它与数据库无关!因为这会返回true:
using (StreamReader sr = new StreamReader("test.csv"))
{
while (!sr.EndOfStream)
{
Console.WriteLine("D1103SL".Equals(sr.ReadLine()));
}
}
test.csv 包含:D1103SLÊ
记事本++:
原来是http://www.codetable.net/hex/ca 我还是看不出它是如何相等的。
【问题讨论】:
-
但它与在 Visual Studio 中调试它的 ABC 相匹配,显示在 quickwatch 中。 这是什么意思?
-
@code参数是nvarchar吗?对于 Unicode 文字,您需要指定
N前缀以防止转换为 varchar:N 'ABCÊ'` -
请出示代码。
?出现在您尝试将文本从一个 ASCII 代码页转换为另一个代码页时,从不使用 Unicode 文本。最有可能的是,参数的类型是varchar。还要确保在您到达数据库命令之前没有发生修改,例如使用错误的代码页读取 ASCII 输入 -
我使用了
comGetProd.Parameters.AddWithValue("code", "ABCÊ");,所以我没有指定sql类型。 comGetProd 是一个 SqlCommand -
请显示插入值的代码。那是发生转换错误的时候。另请注意,
'ABCÊ'是 varchar,而不是 Unicode,必须进行转换。您需要输入N'ABCÊ'才能输入 nvarchar 值。您的SELECT 1 ...语句还比较 varchar,而不是nvarchar值,尽管这不会改变任何内容
标签: c# sql-server character-encoding collation