ワイルドカードでlikeキーワードを使用すると、なぜ間違った結果が得られるのか理解できません。議論のために、私の問題を説明するために小さな例を作成しました。テーブルがあるとしましょう
CREATE TABLE TestingLike(
[Name] VARCHAR(50)
)
INSERT INTO TestingLike VALUES ('A'), ('AB'), ('L') ,('LJ')
この検索条件を使用すると
SELECT [Name] FROM TestingLike WHERE [Name] LIKE 'A%'
SELECT [Name] FROM TestingLike WHERE [Name] LIKE 'L%'
最初のクエリは(A、AB)を返し、2番目のクエリはLだけを返します。不思議なことに、一時テーブルを使用している場合、これは発生しません
神の愛のために誰かがこれが起こっている理由を説明できますか、私はいくつかの調査をしましたが、答えを見つけることができませんでした、私はSQL SERVER RC12017とSQLSMSを使用しています。
お時間をいただきありがとうございます。
以下は実行計画の写真です
I cannot reproduce with a Latin collation but can if I'm using a Croatian collation, because in Croatian (and some other Slavic languages1), Lj
is a single distinct letter formed from two characters, and is not L
followed by j
. Lj (digraph) on wikipedia discusses this
You would not experience the same issue with temp tables/table variables if the collation for tempdb
is different to the default collation for this specific database exhibiting the problem.
Complete/self contained repro script for those playing at home:
declare @TestingLike table(
[Name] VARCHAR(50) collate Croatian_CI_AI
)
INSERT INTO @TestingLike VALUES ('A'), ('AB'), ('L') ,('LJ')
SELECT [Name] FROM @TestingLike WHERE [Name] LIKE 'A%'
SELECT [Name] FROM @TestingLike WHERE [Name] LIKE 'L%'
これを「修正」する方法は、全体的な目標によって異なります。クロアチア語のルールで再生されている場合、コードは正しく機能しています。それ以外の場合は、データベースのデフォルトの照合順序を変更する必要があります。ただし、デフォルトの照合は、列が作成されたときにのみ適用されます。したがって、照合順序を必要なものに変更するには、既存のすべての列を変更する必要もあります。
1私は答え全体でクロアチア語を使用していますが、もちろん、「Lj
有向グラフがある照合」を意味します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加