Обход сортировки SQL

#sql #azure-sql-database #collate

#sql #azure-sql-database #сопоставление

Вопрос:

Есть ли способ «обойти» логику сортировки SQL? Я хочу, чтобы два разных bytearrays выдавали мне два разных ключа независимо от того, что и без SQL, пытающегося их сопоставить.

Я предпочитаю использовать тип данных nvarchar, если это возможно.

Наиболее распространенным параметром сортировки, который я нашел, является ‘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 ).
  

Я использую SQL server в MS Azure.

Комментарии:

1. Конечные пробелы не имеют никакого отношения к сопоставлениям.

2. Вместо этого использовать varbinary?

3. Это стандартные правила SQL — перед тем, как две строки сравниваются на равенство, более короткая строка дополняется пробелами. Как говорит ярлх, ничего общего с сопоставлениями.

4. @Damien_The_Unbeliever Есть ли какой-нибудь способ обойти это (для nvarchar)?

5. Вы можете иметь вычисляемый столбец для обрезанной длины и включить этот столбец в pk. Все еще, но неясно, почему вы это делаете.

Ответ №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')
  

Результат выполнения:

введите описание изображения здесь

В базе данных только для пробелов len и datalength может использоваться для фильтрации данных. При вставке данных в первичный ключ space characters их следует отфильтровывать. Поэтому он не должен поддерживаться.

Для получения более подробной информации или вопросов вы можете обратиться в службу поддержки на портале, и официальный представитель предоставит вам документацию или удовлетворительный ответ.