「どこ」でアクセントを無視する


17

データベースには、caron / hatschekを使用した複数のエントリがあります。現在、ユーザーは、なしでエントリを検索するときに、caron / hatschekを含むエントリを検索したいと考えています。これを簡単な例で示します。

データベースにエントリがあります(名前の連絡先)

Millière

この名前はその人が住んでいる国で正しいです

私たちの国では、caron / hatschekの文字はないため、ユーザーはを検索しMilliereます。è明らかに一致しないため、結果は表示されませんe

私は、これはとして実現することができるか見当がつかないéèêその多くは、より利用可能です(これは手紙のための唯一の例ですe...)。

(文字列をすべてcaron / hatschekで基本文字列に置き換えるだけでよいので、他の方法ははるかに簡単です。明らかに、ユーザーは、障害のある名前ではなく、データベースの名前の正しいバージョンを望んでいます。)


文字 "è"にはキャロン/ハチェクはなく、重大なアクセントがあります。キャロン/ハチェクは「ě」になります。「アクセントのある文字」などの意味ですか?それとも、具体的にキャロン/ハチェックのアクセントを意味しますか?
psmears

「記号」を持つ文字を意味します(実際の名前はわかりません。
lumo

回答:


31

この問題は、アクセントを区別しない照合を使用して解決できます

データベースはおそらくAS(Accent Sensitive)照合を使用しているため、デフォルトではアクセントを含む完全一致を検索します。

比較で照合を指定することにより、データベースのデフォルト以外の照合を使用するようにWHERE句に指示できます。

、このdbfiddle私はLATIN1照合順序を使用した例を作成しましたが、あなたは自分の列が現在使用して照合にAIにASを変更することで、使用している照合と同じアプローチを使用することができます。

コロンが使用している照合と一致するAccent Insensitive照合を使用します。カラムが使用される場合、例えばSQL_Latin1_General_CP1_CI_AS、使用しSQL_Latin1_General_CP1_CI_AIなくLatin1_General_CI_ASまたはLatin1_General_100_CI_ASまたは非SQL_照合の挙動のでこれら二つの変形のいずれかだけアクセント鈍感以上の方法で異なるであろう、そしてそれは、ユーザーが期待できない場合があります。

現在の照合はで確認できますsys.columns

CREATE TABLE testaccent (name nvarchar(50));
GO
INSERT INTO testaccent (name) VALUES ('Millière') , ('Milliere');
GO
-- returns Miliere
SELECT * FROM testaccent WHERE name = 'Milliere';

-- returns both
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AI

--only returns Miliere
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AS

詳細については、「SQL Server照合の使用」をお読みください。

その後、再び、あなたはおそらく(この照合を使用するように並べ替えたいと思いpeufeuはコメントで指摘)「E」と「E」をソートすることを確実にするために。そうしないと、アルファベット順に結果をページングする人は、予想される「é」が見つからないことに驚かれますが、このクエリに触れたいだけであれば、COLLATE句を追加することORDER BYもできます。

で述べたように、ソロモンRutzkyコメントでこれが唯一の1またはいくつかの列に影響を与える場合、別のオプションは、単に「名前」欄を繰り返し、アクセントを区別しない照合を提供し、その後、指数計算されたことを非永続計算列を作成することですカラム。これにより、クエリ内の照合順序を変更することによるスキャンを回避できます。次に、クエリは新しい列でフィルタリングする必要があります。

何かのようなもの:

ALTER TABLE 
dbo.[table_name] ADD [SearchName] datatype_of_name_column 
AS ([Name] COLLATE LATIN1_GENERAL_100_CI_AI)); 

CREATE INDEX [IX_table_name_SearchName] 
ON dbo.[table_name] ([SearchName] ASC);

または、計算列を追加する代わりにビューを作成することもできます(jyaoが好むように)。


1
トム:列が使用しているCollat​​ionのAccent-Insensitiveバージョンを使用する必要があることに注意(および強調)します(段落3で述べたデータベースのデフォルトの照合は、この質問には関係ありません)。列には、使用している場合はSQL_Latin1_General_CP1_CI_AS、使用SQL_Latin1_General_CP1_CI_AIしていないLatin1_General_CI_ASか、Latin1_General_100_CI_AS非動作のため、またはそれらの2の変形のいずれかをSQL_照合だけでアクセント鈍感よりも多くの点で異なり、そのユーザが期待されない場合がありますでしょう。照合順序はにありsys.columnsます。
ソロモンラッツキー

@SolomonRutzky良い提案
トムV-チームモニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.