このクエリ:
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)
よくわかりません。