В SQL Server я запускаю этот простой запрос:
select iif (N'⭐' ='',1,0)
Он возвращает 1. Почему?
Если я попробую другие символы юникода, все будет в порядке. то есть:
select iif (N'✔️' ='',1,0)
Возвращает 0, как и ожидалось.
Текущая подборка: Latin1_General_100_CI_AI
Некоторые символы игнорируются для сравнения в определенных сопоставлениях. Смайлики — это одна из таких вещей, где многие будут рассматриваться как равные друг другу или ничто. Например, CASE N'😺' WHEN N'🚗' THEN 1 END возвращает 1.
Если вам нужно иметь дело с такими символами, вам лучше всего сначала выполнить двоичную сортировку, а затем сравнить.
SELECT
CASE N'😺' COLLATE Latin1_General_BIN WHEN N'🚗' THEN 1 END,
CASE N'😺' COLLATE Latin1_General_BIN WHEN N'' THEN 1 END,
CASE N'⭐' COLLATE Latin1_General_BIN WHEN N'' THEN 1 END;
Затем возвращает COLLATE для всех выражений.
Дб<>рабочий пример
Кажется, что заданный вопрос и проблема, которую нужно решить, на самом деле не одно и то же. Из комментариев кажется, что ОП хочет от NULL до CONSTRAINT, что значение не равно CHECK. Есть несколько способов добиться этого, которые обрабатывают такие символы.
''
в COLLATE
:
ALTER TABLE dbo.YourTable
ADD CONSTRAINT Chk_YourColumn
CHECK (YourColumn COLLATE Latin1_General_BIN <> N'');
CHECK
, что также не позволит использовать такие значения, как LEN
:
ALTER TABLE dbo.YourTable
ADD CONSTRAINT Chk_YourColumn CHECK (LEN(YourColumn) > 0);
' '
, что позволит использовать такие значения, как DATALENGTH
:
ALTER TABLE dbo.YourTable
ADD CONSTRAINT Chk_YourColumn CHECK (DATALENGTH(YourColumn) > 0);
' '
) столбец в таблицу и поставьте PERSISTED
напротив него. Это будет полезно, если вам нужно сравнить эти символы в других местах, и вы также сможете CONSTRAINT
столбец:
ALTER TABLE dbo.YourTable
ADD YourCollatedColumn AS YourColumn COLLATE Latin1_General_BIN PERSISTED;
GO
ALTER TABLE dbo.YourTable
ADD CONSTRAINT Chk_YourCollatedColumn
CHECK (YourCollatedColumn <> N'');
Но должно ли быть наоборот? Звезда - это не смайлик, она есть в "Разных символах и стрелках", "галочка" - в "Дингбатах"
Я использую здесь смайлик как обобщение, @GiacomoCatenazzi.
Привет. Спасибо за ваш вклад. Но я не могу использовать бинарную сортировку в своей базе данных, так как у меня должны быть сортировка AI и CI. проблема возникает, если у меня есть ограничение на поле MyField<>'', тогда я не могу ввести такой символ. что для меня проблема. Пожалуйста, порекомендуйте.
Я не предлагаю вам изменить параметры сортировки базы данных, @YisroelM.Olewski. Это звучит как другая проблема по сравнению с тем, что вы на самом деле сказали нам. Однако вы можете использовать COLLATE в определении CHECK CONSTRAINT.
Вы почти наверняка не хотите PERSISTED. Это устойчивое (ха) заблуждение, что это делает что-то полезное для вещей, которые не являются столбцами с плавающей запятой. Примечательно, что нет необходимости иметь возможность индексировать столбец, и это не заставит (по умолчанию) SQL Server использовать сохраненное значение, а не пересчитывать его при каждом доступе (см. также). В этом случае это вдвойне бесполезно, потому что единственное, что определяет сопоставление для строк Unicode, — это правила сравнения, а не содержимое, поэтому все, что вы делаете, — это сохраняете одни и те же данные дважды.
iif (N'⭐' COLLATE Latin1_General_BIN ='',1,0)
тоже работает