【问题标题】:Bypass SQL COLLATE绕过 SQL COLLATE
【发布时间】:2020-10-02 06:47:05
【问题描述】:

有没有办法“绕过”SQL 整理逻辑?我想要两个不同的字节数组给我两个不同的键,无论如何,并且没有 SQL 试图整理它们。

如果可能,我更喜欢使用 nvarchar 数据类型。

我发现的最通用的 COLLATE 设置是“Latin1_General_100_BIN2”,但在这个示例中,即使这样也给我带来了冲突:

CREATE TABLE [dbo].[test] (
    [Feature] [nvarchar](450) COLLATE Latin1_General_100_BIN2 NOT NULL,
    CONSTRAINT [PK_dbo.test] PRIMARY KEY CLUSTERED ([Feature] ASC)
)

insert into test values ('a')
insert into test values ('a ')

我得到了错误

Violation of PRIMARY KEY constraint 'PK_dbo.test'. Cannot insert duplicate key in object 'dbo.test'. The duplicate key value is (a ).

我在 MS Azure 中使用 SQL 服务器。

【问题讨论】:

  • 尾随空格与排序规则无关。
  • 改用 varbinary?
  • 这是标准的 SQL 规则 - 在比较两个字符串是否相等之前,较短的字符串用空格填充。正如 jarlh 所说,与排序规则无关。
  • @Damien_The_Unbeliever 有没有办法绕过这个(对于 nvarchar)?
  • 您可以为修剪后的长度创建一个计算列,并将该列包含在 pk 中。仍然不清楚您为什么要这样做。

标签: sql azure-sql-database collate


【解决方案1】:

我不建议您使用Feature 字段作为主键。

如果可能,您可以尝试使用以下脚本。

declare @tb table(id int identity,name varchar(20))
insert into @tb(name) values('a'),(' a'),('a ')
select * from @tb --where name=' a' and datalength(name)=datalength(' a')

运行结果:

在数据库中,对于空格,目前只有lendatalength可以用来过滤数据。在主键中插入数据时,space characters 应该被过滤掉。所以应该不支持。

更多详情或问题可以raise a support on the portal,官方会给你文档或满意的答复。

【讨论】:

    猜你喜欢
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2020-01-21
    • 2015-08-26
    相关资源
    最近更新 更多