今更だけれども、SQLServerの『照合順序』というやつでハマったのでメモ。
普通に使っていると、
SELECT 'Hit!' WHERE 'アイウエオ' Like '%イ%'
SELECT 'Hit!' WHERE 'アイウエオ' Like '%い%'
SELECT 'Hit!' WHERE 'アイウエオ' Like '%イ%'
SELECT 'Hit!' WHERE 'あいうえお' Like '%イ%'
SELECT 'Hit!' WHERE 'あいうえお' Like '%い%'
SELECT 'Hit!' WHERE 'あいうえお' Like '%イ%'
SELECT 'Hit!' WHERE 'アイウエオ' Like '%イ%'
SELECT 'Hit!' WHERE 'アイウエオ' Like '%い%'
SELECT 'Hit!' WHERE 'アイウエオ' Like '%イ%'
SELECT 'Hit!' WHERE 'アイウエオ' Like '%い%'
SELECT 'Hit!' WHERE 'アイウエオ' Like '%イ%'
SELECT 'Hit!' WHERE 'あいうえお' Like '%イ%'
SELECT 'Hit!' WHERE 'あいうえお' Like '%い%'
SELECT 'Hit!' WHERE 'あいうえお' Like '%イ%'
SELECT 'Hit!' WHERE 'アイウエオ' Like '%イ%'
SELECT 'Hit!' WHERE 'アイウエオ' Like '%い%'
SELECT 'Hit!' WHERE 'アイウエオ' Like '%イ%'
上記は全て“Hit!”する
(カナだけでなく、アルファベットの全角半角大文字小文字についてもあてはまる)
これは通常データベースの『照合順序』というやつが Japanese_CI_AS なんかでできているかららしい。
(テーブル中のフィールド毎にも設定が変えられる)
この検索を厳密にしたければ、以下のようにする
SELECT 'Hit!' WHERE 'あいうえお' Like '%イ%' COLLATE Japanese_BIN
SELECT 'Hit!' WHERE 'あいうえお' Like '%い%' COLLATE Japanese_BIN /* ←これだけが Hit! */
SELECT 'Hit!' WHERE 'あいうえお' Like '%イ%' COLLATE Japanese_BIN
SELECT 'Hit!' WHERE 'あいうえお' Like '%い%' COLLATE Japanese_BIN /* ←これだけが Hit! */
SELECT 'Hit!' WHERE 'あいうえお' Like '%イ%' COLLATE Japanese_BIN
自分の場合は、patindexの動作で気がついた。
この場合は以下のようにして使う。
SELECT PatIndex('%イ%', 'あいうえお' COLLATE Japanese_BIN)
SELECT PatIndex('%い%', 'あいうえお' COLLATE Japanese_BIN) /* ←これだけが 2 */
SELECT PatIndex('%イ%', 'あいうえお' COLLATE Japanese_BIN)
SELECT PatIndex('%い%', 'あいうえお' COLLATE Japanese_BIN) /* ←これだけが 2 */
SELECT PatIndex('%イ%', 'あいうえお' COLLATE Japanese_BIN)
時に忘れがち。