4

このクエリ:

select *
from op.tag
where tag = 'fussball'

タグ列の値が「fußball」である結果を返します。列 "tag" は nvarchar(150) として定義されます。

文法的に似た言葉であることは理解していますが、この動作を説明して擁護できる人はいますか? 列/テーブルの大文字と小文字の区別を変更できる同じ照合設定に関連していると思いますが、誰がこの動作を望むでしょうか? 列の一意の制約も、制約違反のために一方の値が存在する場合に、一方の値の挿入に失敗します。これをオフにするにはどうすればよいですか?

フォローアップボーナスポイントの質問. このクエリが行を返さない理由を説明してください。

select 1 
where 'fußball' = 'fussball'

おまけの質問 (回答?): @ScottCher は、これは文字列リテラルの「fussball」が varchar として扱われていることが原因であると私に個人的に指摘しました。このクエリは結果を返します:

select 1 
where 'fußball' = cast('fussball' as nvarchar)

しかし、繰り返しますが、これはそうではありません:

select 1 
where cast('fußball' as varchar) = cast('fussball' as varchar)

よくわかりません。

4

5 に答える 5

3

接続/テーブル/データベースの Unicode 照合セットで、ss == ß が指定されていると思います。後者の動作は、高速パスに問題があるか、バイナリ比較を行っているか、正しいエンコーディングで ß を渡していない可能性があります (ばかげていることに同意します)。

http://unicode.org/reports/tr10/#Searchingは、U+00DF が特別なケースであると述べています。洞察に満ちた抜粋を次に示します。

言語に依存した検索と照合は、照合と密接に関連しています。ある強度レベルで等しいと比較される文字列は、言語に依存した照合を行うときに照合する必要がある文字列です。たとえば、主な強度では、UCA に従って「ß」は「ss」と一致し、「aa」は UCA のデンマーク語仕立てで「å」と一致します。

于 2010-02-16T19:47:12.163 に答える
2

SELECT、照合 Latin1_General_CI_AS (SQL2000) を持つ行を返します。

照合 Latin1_General_BINではありません。

N/VARCHAR の後に COLLATE < collat​​ion > キーワードを使用して、テーブル列に照合を割り当てることができます。

次の構文を使用して、特定の照合順序で文字列を比較することもできます

string1 = string2 COLLATE < collation >
于 2010-02-16T19:56:08.120 に答える
2

これは動作を説明する答えではありませんが、関連する可能性があります:

この質問では、の照合を使用することを学びまし

Latin1_General_Bin 

ほとんどの照合の癖を回避します。

于 2010-02-16T21:01:11.030 に答える
1

ボーナスの質問(回答?):@ ScottCherは、文字列リテラル「fussball」がvarcharとして扱われているためだと個人的に指摘しました。このクエリは結果を返します:

select 1 where 'fußball' = cast('fussball' as nvarchar)

ここでは、データ型の優先順位で説明されているように、SQLServerのデータ型の優先順位の規則を扱っています。比較は常に優先順位の高いタイプを使用して行われます。

演算子が異なるデータ型の2つの式を組み合わせる場合、データ型の優先順位の規則では、優先順位の低いデータ型が優先順位の高いデータ型に変換されるように指定されています。

nvarcharはvarcharよりも優先順位が高いため、例の比較はnvarcharタイプを使用して行われるため、実際にはselect 1 where N'fußball' =N'fussball'(つまり、Unicodeタイプを使用して)まったく同じです。これにより、最後のケースで行が返されない理由も明らかになることを願っています。

于 2010-02-16T22:59:56.217 に答える
1

いくつかのヘルパー回答 - あなたの質問に対する完全なものではありませんが、それでも役立つかもしれません:

試してみると:

SELECT 1 WHERE N'fußball' = N'fussball'  

「1」が得られます-「N」を使用してUnicodeを表す場合、2つの文字列は同じと見なされます-なぜそうなのか、私にはわかりません(まだ)。

サーバーのデフォルトの照合順序を見つけるには、次を使用します

SELECT SERVERPROPERTY('Collation')

データベース内の特定の列の照合順序を見つけるには、次のクエリを使用します。

SELECT
  name 'Column Name', 
  OBJECT_NAME(object_id) 'Table Name', 
  collation_name
FROM sys.columns
WHERE object_ID = object_ID('your-table-name') 
AND name = 'your-column-name'
于 2010-02-16T19:56:36.950 に答える