misc.log

日常茶飯事とお仕事と

SQL ServerでのLike検索でエスケープすべき文字

ちょっと理由をうまく説明できなかったのでメモ。

SQLでデータベースから情報を取得する際に「Like」で指定する場合、ワイルドカードとして使える文字があります。そういう「ワイルドカード文字」のような特殊用途文字自体を検索する場合、「これは特殊文字だけど、今回は普通の文字とみなしてね」という指示をするのですが、これを「エスケープ」と呼びます。

で、MicrosoftSQL Serverの場合、エスケープしなければならない文字は下記の3つ。

  • %(パーセント文字) …… Like文で主に用いるワイルドカード文字。たとえば「Like '%文字'」と指定すると、何か0文字以上の適当な文字のあと、最後に「文字」で終わるデータが該当します。
  • _(アンダースコア、下線)…… Like文では「何か1文字」を表すワイルドカード文字。たとえば「Like '%です_'」と指定すると、何か適当な文字のあと、「です」ともう1文字がつながるデータが該当します。
  • [(左大括弧、Opening Bracket) …… Like文では複数の文字を列挙したり範囲指定して該当する文字を検索条件にする場合、その範囲を大括弧で囲んで示します。その左側のカッコです。たとえば「Like ’渡[辺部邊邉]'」と指定すると、「渡辺」「渡部」「渡邉」「渡邊」のいずれかが該当します。ほかにも「[0-9]」とすれば0~9の数字文字どれか、というような範囲指定も可能です。

これらは通常、範囲指定や複数に該当する条件を表すための特殊文字ですが、中には「データに 50% という文字が入っているものを探したい」といった要望もあるかとおもいます。そうするとパーセントの記号を検索する必要がありますね。このような場合、対象文字を大括弧で囲めばOKです。たとえば、「where data like '%50[%]%'」とすれば、「文中に50%が入っている文字列」をdata列から探せます。このような特殊な文字の扱いをC#で行う場合、下記ブログで紹介されているようなコードでリプレースを掛ければOKです。

LIKE で検索するときの文字のエスケープ (SQL Server) / Do Design Space
https://sakapon.wordpress.com/2010/06/21/sqlserverlike/

たとえばこんな感じです。

string sql = Regex.Replace(originalSql, @"[%_\[]", "[$0]");

で、疑問が1つ……。

「なんで右大括弧はエスケープしなくてもいいのか?」

これなんですが、おそらく、そもそも上記3文字を「大括弧」でエスケープするのではなく、T-SQLでのLike検索で使える「複数の文字に合致する」という条件指定の大括弧、これの中では「%」「_」「[」はエスケープしなくてもそのまま使える、という仕様のようです。なので、大括弧で囲むことで、%の場合「%という1文字に一致する」という条件を指定したことになるのではないかと。逆に、大括弧の中では「^(キャレット、否定で利用)」、「-(ハイフン、範囲指定で利用)」、「](右大括弧、範囲指定の終わり)」はエスケープしなければそのままの文字としては使えません。

このあたりは下記のサイトで書かれています。

LIKE (Transact-SQL) / T-SQL Language Reference
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-2017

If the character after an escape character is not a wildcard character, the escape character is discarded and the character following the escape is treated as a regular character in the pattern. This includes the percent sign (%), underscore (_), and left bracket ([) wildcard characters when they are enclosed in double brackets ([ ]).

  • ワイルドカード文字以外がエスケープ文字の後ろに来た場合、エスケープ文字はないものとみなされてエスケープ文字の次の文字は普通にその「文字」として扱われる。
  • これは、大括弧で囲まれた %、_、[ に関しても同様(大括弧の中ではこれらはワイルドカード文字以外とみなされる)。

また、逆に、普通はワイルドカード扱いにならない「^」「-」「]」については、大括弧の中ではエスケープ対象のワイルドカード文字になる、ということのようです。

Also, within the double bracket characters ([ ]), escape characters can be used and the caret (^), hyphen (-), and right bracket (]) can be escaped.


セキュアプログラミング―失敗から学ぶ設計・実装・運用・管理

セキュアプログラミング―失敗から学ぶ設計・実装・運用・管理

WRITING SECURE CODE 第2版 上 (マイクロソフト公式解説書)

WRITING SECURE CODE 第2版 上 (マイクロソフト公式解説書)

自分を作り上げたゲーム4選(電気を使わない系)

twitterで「#自分を作り上げたゲーム4選」というタグが広まっているので、自分も少し思い返してみましょうか。

日本特急旅行ゲーム(タカラ/1979年)

これです。

http://gioco.sytes.net/giaponese/tokkyuu1.jpg

ジョーコデルモンド
http://gioco.sytes.net/tokkyuu.htm

1979年、タカラが出していたボードゲーム。当時8歳~9歳頃。3歳年下の弟と対戦していたので、そうとうルールを覚えるまでにやりとりがあった物と思われます。なつかしいです。これで日本各地の地名を覚えました。新宮とか八戸とか(笑)。

このあたりでボードゲームの面白さを知り、その後、「戦国武将ゲーム」や「世界ジャンボ旅行ゲーム」などをひたすらプレイしていました……。が、なぜか「人生ゲーム」は持ってませんでした。このあたり、何か親の思惑があったのではないかと(戦国武将ゲームも日本各地の旧名を覚えるのに役立ちましたし、世界ジャンボ……も同様)。

D-DAY(エポック/1981年)

エポックから発売されていた、いわゆる「ウォーゲーム」。6角形のマス目に、軍の部隊を模した駒を重ねて置いて部隊を移動させ、戦わせるというもの。エポックからはシリーズで戦史をなぞったゲームがいくつも出ていましたが、これは第二次世界大戦の終盤、ドイツに占領されていたフランスのノルマンディーに連合軍が上陸した、「ノルマンディー上陸作戦」のゲームです。

chiharakai2005.at.webry.info

発売されたのは1981年ですが、買ってもらったのは確か小学5年生か6年生。初めてのウォーゲーム、そもそもの基本的な考え方などから学ぶ必要があり、上陸計画を立てて数ターン先の上陸を見越して部隊編成したり、補給路の考え方など覚えるのは大変でした。小学校の頃の友人と何度もプレイし、ついにはゲーム雑誌「TACTICS」の対戦者募集欄から同じ街の年上の人の家に行ってプレイするという、いわゆる「オフ会」相当のことまでやってしまったという懐かしいゲームです。

映画「ウォーゲーム」が上映されたのも確かこの頃。ゲームジャンル自体はこの映画で知ったのだったと思います。

ウォー・ゲーム [DVD]

ウォー・ゲーム [DVD]

TRAVELLER(GDW、HOBBYJAPAN/1984年)

SFが題材のTRPGテーブルトークRPG)です。当時、ロールプレイングゲームなるものはパソコンでも日本ではまだほとんど出ておらず、ウォーゲーム系の雑誌「TACTICS」の広告にもツクダオリジナルの「STARQUEST」が掲載され、英語版だか日本語版だか判らないダンジョンズ&ドラゴンズの基本セットが出ているくらい。そもそも概念が判っていないので「何をどうする物なのか」全然判らない。そして、お小遣いなどももらっていなかったので、購入するには親を説得するしか無い……しかし何なのか全然判らない(笑)。そんななか、まだ周囲でそんなゲームを誰もやっていない状況で思い切って誕生日だかクリスマスだかに買ってもらったのが「TRAVELLER」の基本セットでした。

f:id:frontline:20120512180835j:plain:w400

まだ自宅に眠っているゲーム達。この右の方にある黒い箱がトラベラーです。入っているのは説明書だけ。これを読んで、ゲームマスター役が複数のプレイヤーに口頭で状況説明。プレイヤーの行動は会話で伝えられ、その結果も会話で、という超絶アナログゲームが「テーブルトークロールプレイングゲーム」でした。この初の試みに付き合ってくれた友人2名、なんだかんだで楽しんでもらえたと思っているのですが、どうだったのでしょうね。結果的にこのSFアドベンチャーのシナリオを作るためにSF小説を読みあさることになり、結果としてSFにハマっていくのですが……。いろんな意味で自分の方向を決めることになったゲームです。

LOSTWORLDS(Nova Game Design、SOFTBANK/1985年)

1985年に発売された「対戦型ゲームブック」です。二人のプレイヤーはそれぞれ相手のキャラクターの本を持ち、行動を記載した表から攻撃手段を選択、相手に伝えます。自分の攻撃と相手の攻撃の組み合わせから判るページを開くと、そのページには相手の攻撃アクションとダメージ等が描かれている、という。自分の本を相手と交換することで、自分から見た相手の光景が手元の本に表示されるというシステム。これもTACTICSなどで紹介されていたのを購入。たしか中学だったかでひたすら昼休みはこれをやっていた記憶があります。

f:id:frontline:20120513095157j:plain:w400

これも弟や友人とひたすらプレイしました。

その他

本当はこんな物ではありません。本当はもっと色々紹介したいのですが、とりあえず4つに絞るとこんな感じかと。その他のものを少しだけ出しておくと……

ちなみにゲームブックは実家から持ってきてますので、いつでも遊べる状態です。

f:id:frontline:20120512182721j:plain:w380f:id:frontline:20120512225253j:plain:w380f:id:frontline:20120512225447j:plain:w380

いずれ細かく紹介したいですね。

俺の歌を聴け~……マクロス7視聴中

Amazonプライム・ビデオで「超時空要塞マクロス(初代)」「マクロス7」「マクロスF」「マクロスΔ」が一気に追加されたので、とりあえず初代とセブンを並行で視聴中。

初代マクロスは当時全然チェック出来ていなくて、興味を持ったときには放送は終わってました。「オーガス」はリアルタイムで見たんですけどね。当時はビデオデッキなども持っていなかったので録画も出来ず、見逃したらアウトでした。マクロス7は大学の頃。バイト先の同僚が強烈に推してきていたのですが、当時はあまり興味も無く見てませんでした。曲はカラオケで何度か聴きましたが……。で、Amazonで無料ならばと見てみたところ、マクロス7、なかなか面白い。

初代マクロスで戦うマックスとミリアが結婚して、その娘「ミレーヌ」が出てくるのですが……これが良いキャラで。主人公よりもミレーヌを見るアニメなんじゃないかと。ということでしばらくコレを見ます。

マクロス7 ULTRA FIRE!!

マクロス7 ULTRA FIRE!!