DBならほぼOracleを住みかとしていた筆者は、PostgreSQLなど他のDB案件を対応してもそこまで困りませんでした。
そのためRDBなら大枠の仕掛けは同じと思っていたら、突然に躓きました。
それは、初めてSQLServer
を使った時でした。
細かく書いてしまうと纏まらないため、手始めにこれだけ前知識として持っていれば良かったなと思う部分を記述していきます。
後は問題あれば都度ググって方針を決めていけば、、といった所です。
#はじめに困ったこと#
・大文字/小文字の区別をしない(デフォルト)
サーバーレベル
かSQL単位
で変えられますが、これが一番面をくらいました(苦笑
例えば、aとAを区別しません。
・半角/全角の区別をしない(デフォルト)
カタカナが代表例でしょうか。これも地味にいやらしい気がします。
#コレーション(collation)#
SQL単位での検索方法を指定するやり方があります。具体的には下記です。
参考: T-SQL: ケースセンシティブ(大文字と小文字を区別して)で文字列を比較する
・CI、CS
一文字目のC は大文字小文字(Case)
という意味です。 二文字目のI (Insensitive)
は区別なしS (Sensitive)
は区別ありです。
・WS
全角・半角文字を区別するオプション
#コレーション(collation) ※サーバーレベルで変更する場合#
やり方は公式サイトで公開されています。
参考: サーバーの照合順序の設定または変更
ただし、変更は可能なんですが、SQL単位に指定するのが面倒だという理由で安易に設定するのはやめましょう。
その影響範囲を把握しておかないと大変なことになるかも知れません。
どうしても設定したい場合は、格納されるデータとSQL検索されるケースをしっかり把握してから利用しましょう。
筆者は、大文字小文字の区別をしない方が利用者にとってメリットがあったため、デフォルト設定を仕様として定める事にしました。
#その他#
・null値と空文字
完全に区別されます。
DBによって仕様差異が散見されるやつです。
※この仕様を把握しておかないと兎に角、不具合を起こしやすいです。
例えば、テーブル定義でnull不可として空文字をセットする仕様として、DBデータからnull値を排除した方が扱いやすいように思えますが、、
残念ながら外部結合
した場合、対象レコードが無いとnull値
がとれるため上手くいきません。もちろん、手間をかければできます。
この事を知らずに後で知ったとき、プログラマーがSQLを書くという環境の場合、プログラマーがめっちゃ苦労します。
不具合の発生率も高まることになりますので、方針を決める方はよくよく留意してほしいところかと思います。
・文字連結のときのnull値
文字とnullを連結すると、結果がnullになります。
※例えばCOALESCE関数
などで空文字に置き換えてやる必要があります。
#接し方をかえてみる#
総じて感じたのは、SQLServerはOffice製品(筆者はExcelがイメージしやすい)の方を向いている気がしました。
特に検索は、表現が正しいとは思いませんがデフォルト設定はExcelの検索
に寄っているような感触です。
RDBのガチガチの検索イメージから少し切り替えて、Excelのデータを検索しているくらいの感覚
を取り入れれば、うまく付き合って行けそう、、。
案外、大文字小文字の区別をしない検索は、利用者が求めている機能だったりします。
ここでは書きませんが、SQLServerは便利機能がモリモリで、いいところも沢山あります。うまく使えば強い味方になりそうです。
以上になりますが、参考になれば幸いです。