sql查询未返回正确的行

本文关键字:返回 查询 sql | 更新日期: 2023-09-27 18:27:16

我有一个名为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'

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

sql查询未返回正确的行

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

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

如果你有各种语言的字符串,那么使用什么排序规则并不是一个简单的答案。如果您希望看起来不同的字符串被认为是不相等的,您可以尝试二进制排序规则。但是,如果使用与系统排序规则不同的排序规则或由于为数据库或表列指定而应用的排序规则来比较字符串,则查询处理器可能无法使用索引,并且查询运行速度可能会慢得多。

用户提供的字符串的解释也可能取决于操作系统的区域设置,结果可能会根据指示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然后"等于"或"不等于"结束作为结果时的情况,a、 b从t