■久しぶりにハマった
・SQLServerのデフォルト設定では文字列検索はけっこう曖昧
スペースの全半角を区別しないとか、大文字小文字を区別しないとか
・この辺のサイトを参考にさせていただきました
https://johobase.com/sqlserver-where-collate/
https://www.projectgroup.info/tips/SQLServer/MSSQL_00000005.html
・MS公式、SQL照合順序(COLLATE)について
https://docs.microsoft.com/ja-jp/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver15
・「文字列」の検索が曖昧なのは、SQLとしてはいいことらしい(今までそう言うケースに遭遇したことはないが・・・)
・なので文字列の重複チェックするときとか気をつけないと地雷を踏む
■チェックする方法とか対策
・DBデフォルトの照合順序を確認
SELECT SERVERPROPERTY('collation')
・検索時にCOLLATEを変える場合
select hoge1, hoge2 from hoge where hoge1 COLLATE Japanese_Bin like 'hogehoge '
※「=」ではなく「LIKE」検索しないと末尾のスペースが考慮されない事象にも遭遇
https://blog.engineer-memo.com/2014/12/20/sql-server-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%8F%AF%E5%A4%89%E9%95%B7%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E6%9C%AB%E5%B0%BE%E3%81%AE%E7%A9%BA%E7%99%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
末尾スペース無視もSQL的にはOKらしいが、LIKEは大丈夫というのも違和感。。
もしかしたら、カラムの型によって末尾SPは挙動が違うかもしれない。今回遭遇したカラムは「nvarchar」。
型によってはスペース埋めすると言う話くらいは聞いたことある…。
SQLServer罠多すぎ…
自分が知らなすぎるから罠にはまるのか…
・SQLServerのデフォルト設定では文字列検索はけっこう曖昧
スペースの全半角を区別しないとか、大文字小文字を区別しないとか
・この辺のサイトを参考にさせていただきました
https://johobase.com/sqlserver-where-collate/
https://www.projectgroup.info/tips/SQLServer/MSSQL_00000005.html
・MS公式、SQL照合順序(COLLATE)について
https://docs.microsoft.com/ja-jp/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver15
・「文字列」の検索が曖昧なのは、SQLとしてはいいことらしい(今までそう言うケースに遭遇したことはないが・・・)
・なので文字列の重複チェックするときとか気をつけないと地雷を踏む
■チェックする方法とか対策
・DBデフォルトの照合順序を確認
SELECT SERVERPROPERTY('collation')
・検索時にCOLLATEを変える場合
select hoge1, hoge2 from hoge where hoge1 COLLATE Japanese_Bin like 'hogehoge '
※「=」ではなく「LIKE」検索しないと末尾のスペースが考慮されない事象にも遭遇
https://blog.engineer-memo.com/2014/12/20/sql-server-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%8F%AF%E5%A4%89%E9%95%B7%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E6%9C%AB%E5%B0%BE%E3%81%AE%E7%A9%BA%E7%99%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
末尾スペース無視もSQL的にはOKらしいが、LIKEは大丈夫というのも違和感。。
もしかしたら、カラムの型によって末尾SPは挙動が違うかもしれない。今回遭遇したカラムは「nvarchar」。
型によってはスペース埋めすると言う話くらいは聞いたことある…。
SQLServer罠多すぎ…
自分が知らなすぎるから罠にはまるのか…