SQLServerの大文字と小文字区別しないので、単純にLIKEで検索してみたら思っていないものが引っかかる
あるあるですが、たまーに忘れてデータ調査するときに、欠落していると困る内容。
改めて、整理してみる。
公式ドキュメントはコチラ
docs.microsoft.com
2021/3/2時点では、SQL Server (サポートされているすべてのバージョン) とAzure SQL データベースが対象。(つまりはすべて)
事象
SteakTable
ID | NAME |
---|---|
1 | NIKU |
2 | niku |
3 | NINNIKU |
4 | ninniku |
5 | NinNiku |
6 | ninNiku |
7 | DemiSource |
SELECT * FROM SteakTable WHERE NAME LIKE '%NIKU%';
結果
ID | NAME |
---|---|
1 | NIKU |
2 | niku |
3 | NINNIKU |
4 | ninniku |
5 | NinNiku |
6 | ninNiku |
デミグラスソース以外がとれてしまう。
本当は、1のNIKUと3のNINNIKUが欲しいのに。。
原因
SQLServerの初期設定で、大文字小文字は区別しない設定になっている。
※公式では既定の照合順序と呼んでるそうな
区別したいんだぁ、と思ったときに解決方法としては3つ!
DBの設定を変更
新しいDBの場合
[データベース] > [新しいデータベース] > [オプション] > [照合順序]
一覧から照合順序を選択
既存DBの場合
[プロパティ] > [オプション] > [照合順序]
一覧から照合順序を選択
カラムの設定を変更
docs.microsoft.com docs.microsoft.com
新しいカラムの場合
CREATE TABLE dbo.SteakTable ( ID INT ,NAME NVARCHAR(50) COLLATE Japanese_CS );
CaseSensitivity CI を指定すると大文字小文字は区別されず、CS を指定すると大文字小文字が区別されます。
AccentSensitivity AI を指定するとアクセントは区別されず、AS を指定するとアクセントが区別されます。
濁点や半濁点のこと
KanatypeSensitive このオプションを省略すると、かなが区別されません。KS を指定すると、かなが区別されます。
ひらがなとカタカナのこと
WidthSensitivity このオプションを省略すると、文字幅が区別されません。WS を指定すると、文字幅が区別されます。
半角や全角のこと
Japanese_の部分
照合順序バージョン | 指定文字列 |
---|---|
100 | Japanese_XJIS_100_ |
90 | Japanese_90、Japanese |
SQLServerのバージョンによって、照合順序バージョンも違うので指定にはサーバーのバージョンごとに気を付ける。
検索するときのみ指定(個人的にはこれ)
SELECT * FROM SteakTable WHERE NAME LIKE '%NIKU%' COLLATE Japanese_CS;
結果
ID | NAME |
---|---|
1 | NIKU |
3 | NINNIKU |
さいごに
公式ドキュメントってわかりにくいと思うのはワタシだけか