2014-01-14 2 views
3

Можете ли вы объяснить мне, почему следующий запрос возвращает строки, которые не удовлетворяют условию LIKE. Столбец в таблице имеет регистр, чувствительный к регистру, поэтому запрос не должен возвращать ничего.Оператор SQL Server LIKE с диапазоном символов и регистром, чувствительным к регистру

CREATE TABLE #temp (col CHAR COLLATE SQL_Latin1_General_CP1_CS_AS); 
INSERT INTO #temp VALUES ('A'), ('B'), ('C'), ('D'), ('E'); 
SELECT * FROM #temp WHERE col LIKE '[b-d]'; 

Любой другой чувствителен к регистру параметры сортировки (например. Latin1_General_100_CS_AS, Polish_100_CS_AS, Modern_Spanish_100_CS_AS) также не работает правильно.

Насколько я могу найти только коллекции двоичного порядка сортировки (Latin1_General_100_BIN2, Modern_Spanish_100_BIN2), хорошо работает.

Эта ошибка существует только в том случае, если я использую диапазон в режиме LIKE. Когда я меняю [b-d] на [bcd], все в порядке.

Является ли это ошибкой в ​​базе данных?

Я использую Microsoft SQL Server 2008 (SP3) - 10.0.5846.0 (X64) Enterprise Edition (64-разрядная версия) на Windows NT 6.1 (Build 7601: Service Pack 1)

+0

Смотрите для получения дополнительной информации здесь: http://stackoverflow.com/questions/8410523/how-does-sql-server-wildcard -character-range-eg-ad-work-with-case-sensitive – Eugene

ответ

4

Нет это не не ошибка.

Диапазон в синтаксисе шаблона не является регулярным выражением. Он определяет диапазон в порядке сортировки сортировки.

Эти сортировки сортируются AaBbCcDd...YyZz (с перевернутым верхним регистром и нижним регистром), поэтому это ожидаемый результат.

Двоичные сортировки сортировать AB .... YZ .... ab ... yz (с отложенным верхним регистром и нижним регистром), поэтому он работает правильно для них.

+0

Это все объясняет. Благодарю. – keiichi

+0

В соответствии с вашим примером, нечувствительным к регистру, [b-d] должен соответствовать d, но не D. Действительно ли это так? Появляется не для: 'SELECT 1 WHERE 'D' LIKE '[b-d]''. – usr

+0

@usr - Возможно, я получил это неправильно, и сначала он сортирует верхний регистр. Но принцип правильный. –

1

Чтобы показать порядок примера вы публикуемые в своем ответе:

CREATE TABLE #temp (col CHAR); 
INSERT INTO #temp VALUES ('A'), ('B'), ('C'), ('D'), ('E'), ('a'), ('b'), ('c'), ('d'), ('e'); 
-- This will work (ABCDEabcde): 
SELECT * FROM #temp ORDER BY col COLLATE Latin1_General_BIN 
-- These will order letters: 
SELECT * FROM #temp ORDER BY col COLLATE Latin1_General_100_CS_AS 
SELECT * FROM #temp ORDER BY col COLLATE Polish_100_CS_AS 
SELECT * FROM #temp ORDER BY col COLLATE Modern_Spanish_100_CS_AS 
SELECT * FROM #temp ORDER BY col COLLATE SQL_Latin1_General_CP1_CS_AS 
Смежные вопросы