1

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

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

4

2 回答 2

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);
于 2013-08-11T08:01:51.257 回答
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

union all select 'Latin1_General_BIN' as Collat​​ion, case when a=b collat​​e Latin1_General_BIN then 'Equal' else 'Not Equal' end as Result, a, b from t

于 2013-08-11T21:39:41.843 回答