#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
их следует отфильтровывать. Поэтому он не должен поддерживаться.
Для получения более подробной информации или вопросов вы можете обратиться в службу поддержки на портале, и официальный представитель предоставит вам документацию или удовлетворительный ответ.