みの雑多ブログ

勉強したことをアウトプットしたり、しなかったり

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

さいごに

公式ドキュメントってわかりにくいと思うのはワタシだけか