2003年9月11日
『照合順序 COLLATE に注意』
8 月末に家族で海に行きました。子供と調子にのってあそびまわっていたら、体が、まっかっか。子供のためにも、体力維持が必要だなと思います。
■照合順序 COLLATE に注意
SQL Server には、照合順序 COLLATE という機能があります。Books Online の表現は、正確ですが難しいと思うので、ここであらためて、利用上の注意をあげてみたいと思います。
注意点:
1. 明示的に指定しない場合は、システムデフォルトが利用される。
システムデフォルトは、「exec sp_helpsort」で調べることができます。実行すると通常、次のようになります。
「Japanese, case-insensitive, accent-sensitive, kanatype-insensitive,
width-insensitive」
省略表記は、次のようになります。
「Japanese_CI_AS」
この表示について、簡単な説明をブログにまとめてました。
* 照合順序の指定
http://www.kawabata.com/yoshihiro/blog/PermaLink.aspx/cf14534f-ff6e-4123-8946-8205986f7665
つまり、この動作を理解して文字列操作をする必要があります。たとえば、デフォルトでは、大文字小文字、ひらがなカタカナ、全角半角が区別されません。
2. 文字列に明示的に指定できる
SET @a = REPLACE(N'ハイフン-と−', N'-', '[-]')
とすると、Japanese_CI_AS では、全角と半角は区別されませんから、
N'ハイフン[-]と[-]'
となります。
ここで、明示的に COLLATE を指定して変換することができます。
SET @a = REPLACE(N'ハイフン-と−' COLLATE Japanese_BIN, N'-', '[-]')
このように指定すると、
N'ハイフン[-]と−'
となります。
列には、COLLATE を指定できますが、文字列変数そのものには、COLLATE は指定できません。デフォルト以外の COLLATE
を利用する列がある場合、随時、明示的に COLLATE を指定する必要があります。
3.varchar への日本語の保存
varchar へ日本語を保存できるのは、COLLATE がJapanese の場合です。たとえば、Latin1_General_CI_AS
の場合、
PRINT 'abcあいう' COLLATE Latin1_General_CI_AS
を実行した場合、「abc???」となります。つまり、日本語部分は、? へ置き換えられます。
以上より、適切に COLLATE を意識してクエリーを実行する必要があります。特に、文字列中の文字をエスケープする場合には、注意が必要かと思います。
MSMVP として活動する中で、マイクロソフトに対する意見を、随時、関連部署の担当の方へ連絡するようにしています。
マイクロソフトの開発者の方々も、MSDN やイベント、自身のブログの中で、どんどん意見交換をしています。とてもいいことだと思います。気軽に話をして、いい製品にしていけるといいですね。
|