トップページへ PASSJ ブログへ
トップページへ
分科会
特集!
コミュニケーション
資格
セミナー・コンファレンス
インフォメーション



セキュリティ ボードリーダー:河端 善博

毎月第2、第4木曜日はボードリーダーからのレポートを掲載いたします。
 
   

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 やイベント、自身のブログの中で、どんどん意見交換をしています。とてもいいことだと思います。気軽に話をして、いい製品にしていけるといいですね。

ボードリーダーレポート トップページへ

 

 
PASSJメールニュース 著作権ついて プライバシーポリシー リンクポリシー お問い合わせ
(C) 2005 Professional Association for SQL Server Japan. All rights reserved.