T-SQL содержит поиск и Umlaut на немецком языке для SQL Server 2008 R2 - PullRequest
3 голосов
/ 16 ноября 2010

Я сталкиваюсь с проблемой в SQL Server 2008 R2, где мне приходится использовать поиск содержимого при игнорировании немецких букв умножения (ä, ö, ü).

Для всех не говорящих по-немецки разработчиков: немецкийУмлаут-буквы могут быть представлены как обычные основные буквы (a при использовании ä) и e.Таким образом, Мюллер такой же, как Мюллер, а Беккер такой же, как Беккер.

Что мы хотим сделать, так это: при поиске «Мюллер» мы хотели бы найти данные, содержащие «Мюллер», а также «Мюллер»"и при вводе" Мюллер "мы хотели бы найти записи, содержащие" Мюллер ", а также" Мюллер ".

При сравнении данных с использованием подобно или = вы просто добавляете COLLATE German_PhoneBook_CI_AI.При использовании поиска по содержимому с полнотекстовым индексом это не так просто.Вы можете отключить чувствительность акцента, но тогда поиск по содержимому обрабатывает букву ü как букву u, букву ä как букву a, а букву ö как букву o, но не находит записи, которые содержат oe вместо ö, ueвместо ü и ae вместо ä.

Установка параметров сортировки для столбца на «German_Phonebook_CI_AS» или «German_Phonebook_100_CI_AS», похоже, тоже не помогает.

Ответы [ 2 ]

6 голосов
/ 22 декабря 2012

Вы должны выполнить следующие действия:

  1. Создание полнотекстового каталога с чувствительностью к акценту
  2. Создать полнотекстовый указатель с указанием немецкого языка
  3. Используйте 'FORMSOF (INFLECTIONAL, yourquery)' для запросов

См. Следующий пример:

CREATE TABLE MyTable (
    ID int IDENTITY CONSTRAINT PK_MyTable PRIMARY KEY,
    Txt nvarchar(max) COLLATE German_PhoneBook_100_CI_AI NOT NULL
)

INSERT INTO dbo.MyTable
VALUES (N'Müller'), (N'Mueller'), (N'Muller'), (N'Miller')

GO
CREATE FULLTEXT CATALOG FTSCatalog WITH ACCENT_SENSITIVITY=ON AS DEFAULT
CREATE FULLTEXT INDEX ON MyTable (Txt LANGUAGE German) KEY INDEX PK_MyTable
GO
WHILE EXISTS (
    SELECT * FROM sys.dm_fts_index_population
    WHERE database_id=DB_ID()
    AND status<>7
) WAITFOR DELAY '0:0:1'

GO
SELECT * FROM CONTAINSTABLE(dbo.MyTable,Txt,N'FORMSOF(INFLECTIONAL,Müller)')
SELECT * FROM CONTAINSTABLE(dbo.MyTable,Txt,N'FORMSOF(INFLECTIONAL,Muller)')
SELECT * FROM CONTAINSTABLE(dbo.MyTable,Txt,N'FORMSOF(INFLECTIONAL,Mueller)')

GO
DROP FULLTEXT INDEX ON MyTable
DROP FULLTEXT CATALOG FTSCatalog 
GO
DROP TABLE dbo.MyTable
0 голосов
/ 16 ноября 2010

Я бы посоветовал вам искать в данном случае как Müller, так и Mueller.

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