SQL Server запрашивает чувствительность к регистру - PullRequest
19 голосов
/ 02 августа 2010

У меня есть база данных:

abcDEF

ABCdef

abcdef

если я напишу: select * from MyTbl where A='ABCdef'

как получить: ABCdef

и как получить:

abcDEF

    ABCdef

    abcdef

Заранее спасибо

забыл написать - sqlCE

Ответы [ 5 ]

32 голосов
/ 02 августа 2010

Вы можете сделать запрос чувствительным к регистру, используя ключевое слово COLLATE.

SELECT A 
FROM MyTbl 
WHERE A COLLATE Latin1_General_CS_AS = 'ABCdef'
6 голосов
/ 02 августа 2010

Если в базе данных уже есть abcDEF, ABCdef, abcdef, значит, она уже чувствительна к регистру или у вас нет ограничений.

Вам нужно будет добавить COLLATE с обеих сторон, чтобы убедиться, что он действительно чувствителен к регистру (для не чувствительной к регистру базы данных), что сделает недействительным использование индекса

SELECT TheColumn
FROM MyTable 
WHERE TheColumn COLLATE Latin1_General_CS_AS = 'ABCdef' COLLATE Latin1_General_CS_AS

А как насчет акцентов? Latin1_General_CS_AI, Latin1_General_Bin?

1 голос
/ 18 июня 2016

Попробуйте просто добавить двоичное ключевое слово после where:

select * from MyTbl where binary A = 'ABCdef';
1 голос
/ 02 августа 2010

SQL по умолчанию не чувствителен к регистру, поэтому вы получите все три элемента, если будете выполнять простое сравнение строк.Чтобы сделать его чувствительным к регистру, вы можете преобразовать значение поля и значение поиска как varbinary:

SELECT * FROM MyTbl WHERE CAST(A AS varbinary(20)) = CAST('ABCdef' as varbinary(20))

Выше предполагается, что ваше поле varchar имеет размер 20. Для nvarchar удвойте его (спасибо @ ps2goat).

1 голос
/ 02 августа 2010

Все дело в сопоставлении. Каждый из них имеет суффикс (CI и CS, что означает регистр и регистр).

http://www.databasejournal.com/features/mssql/article.php/10894_3302341_2/SQL-Server-and-Collation.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...