Почему звездочка юникода игнорируется?

В SQL Server я запускаю этот простой запрос:

select iif (N'⭐' ='',1,0)   

Он возвращает 1. Почему?

Если я попробую другие символы юникода, все будет в порядке. то есть:

select iif (N'✔️' ='',1,0)   

Возвращает 0, как и ожидалось.

Текущая подборка: Latin1_General_100_CI_AI

Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
Уроки CSS 6
Уроки CSS 6
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки...
4
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Некоторые символы игнорируются для сравнения в определенных сопоставлениях. Смайлики — это одна из таких вещей, где многие будут рассматриваться как равные друг другу или ничто. Например, 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'');
    
iif (N'⭐' COLLATE Latin1_General_BIN ='',1,0) тоже работает
Panagiotis Kanavos 20.02.2023 15:31

Но должно ли быть наоборот? Звезда - это не смайлик, она есть в "Разных символах и стрелках", "галочка" - в "Дингбатах"

Giacomo Catenazzi 20.02.2023 15:31

Я использую здесь смайлик как обобщение, @GiacomoCatenazzi.

Larnu 20.02.2023 15:31

Привет. Спасибо за ваш вклад. Но я не могу использовать бинарную сортировку в своей базе данных, так как у меня должны быть сортировка AI и CI. проблема возникает, если у меня есть ограничение на поле MyField<>'', тогда я не могу ввести такой символ. что для меня проблема. Пожалуйста, порекомендуйте.

Yisroel M. Olewski 20.02.2023 15:43

Я не предлагаю вам изменить параметры сортировки базы данных, @YisroelM.Olewski. Это звучит как другая проблема по сравнению с тем, что вы на самом деле сказали нам. Однако вы можете использовать COLLATE в определении CHECK CONSTRAINT.

Larnu 20.02.2023 15:45

Вы почти наверняка не хотите PERSISTED. Это устойчивое (ха) заблуждение, что это делает что-то полезное для вещей, которые не являются столбцами с плавающей запятой. Примечательно, что нет необходимости иметь возможность индексировать столбец, и это не заставит (по умолчанию) SQL Server использовать сохраненное значение, а не пересчитывать его при каждом доступе (см. также). В этом случае это вдвойне бесполезно, потому что единственное, что определяет сопоставление для строк Unicode, — это правила сравнения, а не содержимое, поэтому все, что вы делаете, — это сохраняете одни и те же данные дважды.

Jeroen Mostert 20.02.2023 16:27

Другие вопросы по теме