SQL Server запрашивает чувствительность к регистру

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

abcDEF

ABCdef

abcdef

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

как добраться: ABCdef

и как добраться:

abcDEF

    ABCdef

    abcdef

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

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

19
задан marc_s 2 August 2010 в 12:46
поделиться

4 ответа

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

SELECT A 
FROM MyTbl 
WHERE A COLLATE Latin1_General_CS_AS = 'ABCdef'
32
ответ дан 30 November 2019 в 03:16
поделиться

Если у вас уже есть 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 ?

6
ответ дан 30 November 2019 в 03:16
поделиться

Все дело в сопоставлении. У каждого есть суффикс (CI и CS, что означает нечувствительность к регистру и чувствительность к регистру).

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

1
ответ дан 30 November 2019 в 03:16
поделиться

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

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

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

1
ответ дан 30 November 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: