Остальные четыре ответа в разной степени неверны.
Я разъясню все недоразумения, чтобы читатели могли сделать наиболее подходящий / эффективный выбор.
Не использовать UPPER()
. Это совершенно ненужная дополнительная работа. Используйте предложение COLLATE
. Сравнение строк необходимо выполнить в любом случае, но использование UPPER()
также должно проверять, символ за символом, чтобы увидеть, есть ли отображение в верхнем регистре, а затем изменить его. И вам нужно сделать это с обеих сторон. Добавление COLLATE
просто направляет обработку для генерации ключей сортировки с использованием набора правил, отличного от того, который использовался по умолчанию. Использование COLLATE
определенно более эффективно (или «производительно», если вам нравится это слово :), чем использование UPPER()
, как доказано в этом тестовом скрипте (в PasteBin) .
Существует также проблема , отмеченная @Ceisc при ответе @ Дэнни:
В некоторых языках преобразования не осуществляются в обоих направлениях. то есть НИЖНЯЯ (x)! = НИЖНЯЯ (ВЕРХНЯЯ (x)).
Турецкий верхний регистр "İ" является типичным примером.
Нет, сортировка не является настройкой для всей базы данных, по крайней мере, не в этом контексте. Существует сопоставление по умолчанию на уровне базы данных, и оно используется в качестве значения по умолчанию для измененных и вновь создаваемых столбцов, в которых не указано предложение COLLATE
(что, вероятно, связано с этим распространенным заблуждением), но оно не влияет на запросы напрямую. если вы не сравниваете строковые литералы и переменные с другими строковыми литералами и переменными или не используете метаданные уровня базы данных.
Нет, сопоставление не по запросу.
Сопоставления для предиката (то есть что-то операндное) или выражение, а не для запроса. И это верно для всего запроса, а не только для предложения WHERE
. Это включает в себя СОЕДИНЕНИЯ, ГРУППЫ BY, ORDER BY, PARTITION BY и т.д.
Нет, не конвертировать в VARBINARY
(например, convert(varbinary, myField) = convert(varbinary, 'sOmeVal')
) по следующим причинам:
- это бинарное сравнение, которое не учитывает регистр (вот что задает этот вопрос)
- если вы хотите двоичное сравнение, используйте двоичное сопоставление. Используйте тот, который заканчивается на
_BIN2
, если вы используете SQL Server 2008 или новее, иначе у вас нет другого выбора, кроме как использовать тот, который заканчивается на _BIN
. Если данные NVARCHAR
, то не имеет значения, какую локаль вы используете, поскольку в этом случае они все одинаковые, следовательно, Latin1_General_100_BIN2
всегда работает. Если данные VARCHAR
, вы должны использовать ту же локаль, в которой находятся данные (например, Latin1_General
, French
, Japanese_XJIS
и т. Д.), Потому что локаль определяет используемую кодовую страницу и изменяет код страницы могут изменить данные (т.е. потерю данных).
- использование типа данных переменной длины без указания размера будет зависеть от размера по умолчанию, и существуют два различных значения по умолчанию в зависимости от контекста, в котором используется тип данных. Это либо 1, либо 30 для строковых типов. При использовании с
CONVERT()
будет использоваться значение по умолчанию 30. Опасность заключается в том, что если длина строки может превышать 30 байт, она будет молча усечена, и вы, вероятно, получите неверные результаты из этого предиката.
- Даже если вы хотите сравнение с учетом регистра, двоичные параметры сортировки не с учетом регистра (еще одно очень распространенное заблуждение).
Нет, LIKE
не всегда чувствителен к регистру. Он использует сопоставление столбца, на который ссылаются, или сопоставление базы данных, если переменная сравнивается со строковым литералом, или сопоставление, указанное в необязательном предложении COLLATE
.
LCASE
не является функцией SQL Server. Похоже, это либо Oracle, либо MySQL. Или, возможно, Visual Basic?
Поскольку контекст вопроса сравнивает столбец со строковым литералом, ни параметры сортировки экземпляра (часто называемого «сервером»), ни параметры сопоставления базы данных не имеют direct влияние здесь. Параметры сортировки хранятся для каждого столбца, и каждый столбец может иметь разные параметры сортировки, и эти параметры сортировки не обязательно должны быть такими же, как параметры сортировки базы данных по умолчанию или параметры сортировки экземпляра. Конечно, сопоставление экземпляра является значением по умолчанию для того, что вновь созданная база данных будет использовать в качестве сопоставления по умолчанию, если при создании базы данных не было указано условие COLLATE
. Аналогичным образом, сопоставление по умолчанию для базы данных - это то, что будет использовать измененный или только что созданный столбец, если не указано предложение COLLATE
.
Следует использовать сопоставление без учета регистра, которое в остальном совпадает с сопоставлением столбца. Используйте следующий запрос, чтобы найти параметры сортировки столбца (измените имя таблицы и имя схемы):
SELECT col.*
FROM sys.columns col
WHERE col.[object_id] = OBJECT_ID(N'dbo.TableName')
AND col.[collation_name] IS NOT NULL;
Тогда просто измените _CS
на _CI
. Итак, Latin1_General_100_CS_AS
станет Latin1_General_100_CI_AS
.
Если в столбце используется двоичное сопоставление (оканчивающееся на _BIN
или _BIN2
), найдите аналогичное сопоставление, используя следующий запрос:
SELECT *
FROM sys.fn_helpcollations() col
WHERE col.[name] LIKE N'{CurrentCollationMinus"_BIN"}[_]CI[_]%';
Например, если в столбце используется Japanese_XJIS_100_BIN2
, сделайте следующее:
SELECT *
FROM sys.fn_helpcollations() col
WHERE col.[name] LIKE N'Japanese_XJIS_100[_]CI[_]%';
Для получения дополнительной информации о сопоставлениях, кодировках и т. Д. Посетите: Сведения о сопоставлениях