SQL查询不返回正确的行

时间:2013-08-11 04:26:01

标签: c# sql

我有一个名为1的表,其中包含以下记录:

ID  one          two                  three
1: 1AijS0 - 6Aݨ⻈㗨㙡㙡⻑S0S0S0S0S0S0 - 1AijS0
2: 1AijS0 - 6Aࡀ㐠㗨㙡㙡⻑S0S0S0S0S0S0 - 1AijS0

(请注意,两个记录中的一列和三列有5个字符且相同,两列有20个字符但不相同)

这里我有一个问题:

当我使用这个删除命令(无论在哪里)时,两行都被删除(虽然正确的行是第二行):

DELETE FROM [1] WHERE two='6Aࡀ㐠㗨㙡㙡⻑S0S0S0S0S0S0' AND three='1AijS0' AND one='1AijS0'

我还没有看到其他记录示例中的第二个问题。

2 个答案:

答案 0 :(得分:1)

如果列是nvarchar,你应该使用N前缀来表示nvarchar文字......

SELECT * FROM [1] WHERE two=N'6Aݨ⻈㗨㙡㙡⻑...

但更好:使用参数,避免了这个问题,同时也避免了SQL注入:

SELECT * FROM [1] WHERE two=@two

并添加参数:

string two = ... // the value you want
cmd.Parameters.AddWithValue("two", two);

答案 1 :(得分:0)

字符串比较的结果取决于字符集排序规则。默认情况下,这是安装服务器实例时指定的排序规则,但也可以在数据库和表列级别指定排序规则。它们也可以在查询中指定。排序规则可以应用于比较和单个字符串,并且有很多关于排序规则兼容性的规则。

在运行查询时使用的排序规则中,示例中的字符串被视为相等。

如果您有各种语言的字符串,那么使用哪种排序规则并不容易。如果您希望看起来不同的字符串被视为不相等,则可以尝试二进制排序规则。但是,如果使用与系统排序规则或应用的排序规则不同的排序规则来比较字符串,因为它是为数据库或表列指定的,则查询处理器可能无法使用索引,并且您的查询可能运行得更多慢。

用户提供的字符串的解释也可能取决于操作系统区域设置,结果可能会根据使用指示Unicode的N进行更改。

以下是一些演示文稿,说明您的示例中的字符串在某些排序规则下可能会被视为相等,而在其他排序规则下则不相等:

with t(a,b) as (
  select
    N'6Aࡀ㐠㗨㙡㙡⻑S0S0S0S0S0S0',
    N'6Aݨ⻈㗨㙡㙡⻑S0S0S0S0S0S0'
)
  select
    'Japanese_CI_AI' as Collation,
    case when a=b collate Japanese_CI_AI then 'Equal' else 'Not Equal' end as Result,
    a, b
  from t
  union all
  select
    'Latin1_General_100_CS_AI' as Collation,
    case when a=b collate Latin1_General_100_CS_AI then 'Equal' else 'Not Equal' end as Result,
    a, b
  from t
  union all
  select
    'Arabic_100_CI_AS' as Collation,
    case when a=b collate Arabic_100_CI_AS then 'Equal' else 'Not Equal' end as Result,
    a, b
  from t
  union all
  select
    'SQL_Latin1_General_CP1_CI_AI' as Collation,
    case when a=b collate SQL_Latin1_General_CP1_CI_AI then 'Equal' else 'Not Equal' end as Result,
    a, b
  from t

联合所有人   选择     'Latin1_General_BIN'作为整理,     如果a = b整理Latin1_General_BIN然后'Equal',则'Not Equal'结束为Result,     a,b   从t