2009-07-23 19 views
0

私たちは、アプリケーションの中で非常に奇妙な問題に遭遇しました。 seachエンジンは、ストアドプロシージャを使用して複数のフィルタを比較します。しかし、特定のタイプの文字列が挿入されると、SQL Server(2005)は非常に奇妙な動作をします。SQLの 'Like'演算子と 'aa'

select 'match!' where 'teliaa' like '%telia%' 

照合はデンマーク、ノルウェーCI ASであり、我々は同じことを意味し、文字を持っている:私は、次のように問題を分離しました。これには 'å'を意味する 'aa'も含まれます。

上記の声明が「マッチ」をもたらさない理由を誰もが説明できますか?

+2

あなたは「奇妙な」振る舞いが実際に何であるかは述べていません。 –

+0

サスペンスのままにしないでください...クエリは何を返しますか? – Greg

+1

を選択してください '一致!' '%telia%'のような 'teliaardvark'も一致します。終了%はワイルドカードです。 – Meep3D

答えて

2

「aa」と「å」は自動的に照合されません。

「å」が正しくソートされていることを確認しますが、は、の代わりになりません。 ドイツ語の "ss" vs "ß"も同様です。

データを一方向に消去する必要があります。

SELECT REPLACE ('teliå', 'å', 'aa'), /* ...or */REPLACE ('teliaa', 'aa', 'å') 

編集、2013年5月

私はåはその照合でaaと一致していません推測しています。それは正しくソート

DECLARE @foo TABLE (bar varchar(2)) 
INSERT @foo VALUES ('Ab'),('Aa'),('aa'), ('å'), ('Za'); 

SELECT * FROM @foo ORDER BY bar COLLATE Danish_Norwegian_CI_AS; 

SELECT * FROM @foo WHERE bar COLLATE Danish_Norwegian_CI_AS = 'Aa'; 
SELECT * FROM @foo WHERE bar COLLATE Danish_Norwegian_CI_AS = 'a'; 
SELECT * FROM @foo WHERE bar COLLATE Danish_Norwegian_CI_AS = 'å'; 
+0

比較する前に、データベース内のフィルタパラメータとデータの両方を正規化します。しかし、上記の状態は一致しません(どちらもMeep3Dの例はありません)。問題は、文字列 'teliaa'が '%telia%'と一致しない理由です。 – jaspernygaard

-2
select 'match!' where 'teliaa' like '%telia%' 

与えないしかし 'と一致!'私のSQL-2008(SP1)10.0.2531.0(x64)の

で出力として私はあなたの質問に答えることができない...

+0

なぜdownvote?select文の結果に対する私の答えは、小切手でも述べたように正しいです。 – Ice

+0

私はdownvoteがあなたが照合に因っているからだと思っています – gbn

+0

そしてあなたが言ったように質問に答えることはできませんが、まだ受け入れられます – gbn

0

照合は、文字を比較するための並べ替えのために最も有用なルールの集合です。ソートにのみ影響すると言う人もいますが、これは完全に正しいわけではありません。 https://technet.microsoft.com/en-us/library/aa174903%28v=sql.80%29.aspx

からSQL Server照合順序は、どのようにデータベースエンジンストアを定義し、文字とUnicodeのデータを操作します。

例として、Danish_Norwegianアクセントの非機密照合では、 'aa'と 'å'が一致します。 「aa」で始まる名前は、「å」で始まる名前とともに並べ替えられます。ただし、比較やLIKE演算子にも影響します。これを示すいくつかのクエリ文字列があります。

あなたの必要性に応じて、
select 'match!' where 'teliaa' collate Latin1_General_100_CI_AI like '%telia%' --yields "match!" 
select 'match!' where 'teliaa' collate Latin1_General_100_CI_AS like '%telia%' --yields "match!" 
select 'match!' where 'teliaa' collate Latin1_General_100_CS_AI like '%telia%' --yields "match!" 
select 'match!' where 'teliaa' collate Latin1_General_100_CS_AS like '%telia%' --yields "match!" 

select 'match!' where 'teliaa' collate Danish_Norwegian_CI_AI like '%telia%' --no rows 
select 'match!' where 'teliaa' collate Danish_Norwegian_CI_AS like '%telia%' --no rows 
select 'match!' where 'teliaa' collate Danish_Norwegian_CS_AI like '%telia%' --no rows 
select 'match!' where 'teliaa' collate Danish_Norwegian_CS_AS like '%telia%' --no rows 

select 'match!' where 'teliaa' collate Danish_Norwegian_CI_AI like '%å%' --yields "match!" 
select 'match!' where 'teliaa' collate Danish_Norwegian_CI_AS like '%å%' --no rows 
select 'match!' where 'teliaa' collate Danish_Norwegian_CS_AI like '%å%' --yields "match!" 
select 'match!' where 'teliaa' collate Danish_Norwegian_CS_AS like '%å%' --no rows 

、あなたがあなたのクエリまたはデータストア/列でこれをサポートして照合を選択し、同じそれらを処理する、「A」に「AA」と一致する必要がある場合。そうでない場合は、Latin1_General_100_CI_AIのような照合順序を選択します。

関連する問題