Почему SQL и ? одинаковы в SQL Server - PullRequest
4 голосов
/ 20 мая 2019

В SSMS v17.9 при подключении к экземпляру SQL Server 14.0.1000 система обрабатывает эти два символа одинаково: ? и ?

Я установил таблицу [Kanji] с [Char] NVARCHAR (2) в качестве первичного ключа. После того как я добавил «cannot», я не могу добавить «it», так как он выдал ошибку «дублирование ключа».

Я запустил этот T-SQL:

IF ( N'?' = N'?') PRINT 'true' ELSE PRINT 'false'

Результат выводит 'true'.

Ответы [ 3 ]

6 голосов
/ 20 мая 2019

вы должны использовать правильное сопоставление,

IF ( N'?' COLLATE Chinese_Simplified_Stroke_Order_100_CI_AI = N'?' COLLATE Chinese_Simplified_Stroke_Order_100_CI_AI) PRINT 'true' ELSE PRINT 'false'

сопоставление можно установить на лету в операторе выбора или на уровне объекта БД

Подробнее о сопоставлениях

3 голосов
/ 20 мая 2019

На основе определения из Википедии: https://en.wikipedia.org/wiki/Collation

Алгоритм сопоставления, такой как алгоритм сопоставления Unicode, определяет порядок в процессе сравнения двух заданных строк символов и принятия решения, которое должно предшествоватьДругой.Когда порядок определен таким образом, алгоритм сортировки может быть использован для размещения списка любого количества элементов в этом порядке.

Когда вы ссылаетесь на символ, этот SQL Server неЕсли у вас есть сценарий, то SQL Server будет обрабатывать его как символ ?, поэтому вы увидите, что оба символа ? и ? одинаковы, поскольку оба они обрабатываются как ?

.Чтобы избежать такого поведения, вам нужно настроить подходящее сопоставление для вашей базы данных или столбца таблицы или строкового литерала.

Так что, как написал @Hiran (https://stackoverflow.com/a/56220111/1666800), вам нужно будет настроить подходящее сопоставление.

Подробнее о сопоставлении в SQL Server: https://docs.microsoft.com/en-us/sql/t-sql/statements/collations?view=sql-server-2017

Вот несколько кодов, которые помогут вам настроить параметры сортировки:

Установить параметры сортировки в базе данных:

ALTER DATABASE <Database>
COLLATE <Your Collation> ;
GO

Установить сопоставление для столбца таблицы:

USE <Database>
GO
ALTER TABLE <Table Nme>
ALTER COLUMN <Column Name> <Data Type>
COLLATE <Your Collation> <Other options>
GO

Установить сопоставление для строкового литерала:

SELECT N'?' COLLATE <Your Collation>
2 голосов
/ 21 мая 2019

Помимо сопоставлений, я бы посоветовал взглянуть на кодовые точки юникода или двоичное представление:

SELECT UNICODE(N'?'), CAST(N'?' AS BINARY(4))
     , UNICODE(N'?'), CAST(N'?' AS BINARY(4))

Результат

55384   0x58D84CDF  
55391   0x5FD8B7DF
...