2013-12-14 2 views
0

У меня есть следующий SQL-запрос:Поиск в таблице базы данных возвращает другой результат

select Title 
from dbo.posts 
where CAST(CHARINDEX(N'mão', [Title]) AS int) > 0 

Это возвращает запись, как и ожидалось. Если я заменю «mão» на «mao», я не получаю записи.

Моя сортировка базы данных - Latin1_General_CI_AS. Я создал базу данных, используя:

create database MyDb 
on primary ( 
    size = 40MB, 
    maxsize = 2GB, 
    filegrowth = 20MB 
) 
log on ( 
    size = 4MB, 
    maxsize = 200MB, 
    filegrowth = 2MB 
) 
collate Latin1_General_CI_AS 
go 

Что может быть неправильным?

Спасибо, Miguel

+2

Предположительно, что случилось в том, что у вас есть один титул с «МАО» и никаких титулов с «мао» в них. – RBarryYoung

ответ

3

Сопоставление Latin1_General_CI_AS является AS = Accent Sensitive. Если вам нужно получить также строки, контактирующие с mao, вам понадобится сопоставление Accent Insensitive.

Пример сортировки AS/AI (примечание: СОЕДИНЕНИЕ удалить дубликаты):

PRINT 'Test #1' -- AS : mão and mao are different words 
SELECT N'mão' collate Latin1_General_CI_AS AS Col1 
UNION 
SELECT N'mao' collate Latin1_General_CI_AS AS Col1 

PRINT 'Test #2' -- AI: mão and mao are similar words 
SELECT N'mão' collate Latin1_General_CI_AI AS Col2 
UNION 
SELECT N'mao' collate Latin1_General_CI_AI AS Col2 

Результаты:

Test #1 
Col1 
---- 
mão 
mao 
(2 row(s) affected) 

Test #2 
Col2 
---- 
mão 
(1 row(s) affected) 
1

Все это имеет отношение к обобщению 'Latin1_General_CI_AS'. Игнорируйте регистр, но проверьте акцент.

Поэтому слово mão и mao разные.

Вот ссылка от MSDN с несколькими примерами.

http://technet.microsoft.com/en-us/library/ms179886.aspx

Если вы вынуждаете сверку быть Accent Нечувствительность, вы должны получить вашу запись обратно.

TSQL Код сниппета:

-- Ignoring accents will return the data record 
SELECT Title 
FROM dbo.posts 
WHERE 
    Title COLLATE Latin1_General_CP1_CI_AI 
    LIKE '%mao%' COLLATE Latin1_General_CI_AI; 
+0

Typo ... Будет исправлено. –

Смежные вопросы