日付定数のフォーマットで注意が必要です(米国製コンポーネント特有の注意点)

(1) 日付定数のフォーマット

SQL文中に日付定数を挿入する場合、デフォルト(ANSI Standard)の日付フォーマットは YYYY-MM-DDです。
幸いなことに、日本の表記法は、ANSI標準に近いので、悩むことはないでしょう。(たとえば米国ではMM/DD/YYYY。):

  SELECT * FROM Order WHERE OrderDate >='2001/07/04'

ではなく:

  SELECT * FROM Order WHERE OrderDate >='2001-07-04' 

としなければなりません。

(2)2バイト文字列に対するLIKE検索(対策はあります)

日本語文字列を含む項目に対してLIKE節を使った検索をする場合、以下のように、文字列の途中での部分一致(LIKE)検索で、誤動作の可能性があります。(前方一致検索の場合には問題なし):

  SELECT FROM Customer WHERE DataPath Like '%\%'

たとえば、漢字の「表」という字の2バイト目は、1バイト文字「\」とコードが一致するため、ヒットしてしまうのです!

簡単な対策としては以下が考えられます

<li>前方一致検索のみを許し、途中での部分一致検索をしない: パフォーマンスの点でも、悪くない考えです。</li>
<li>全角半角交じりの項目を作らない: Like '%\% ではなく Like '%¥%'ならばO.K.になります。</li>

本格対応: 2001/11/13 全角半角交じり文字列のLIKE比較について、日本語対応が可能になりました。弊社にてDBISAMのソースコードの日本語対応を行っております。ソースコードご購入のユーザ様にはご希望に応じて修正箇所の情報をお知らせします。バイナリ配布についてはライセンス上やサポート体制上の問題があり、申し訳ありませんが行えません。

文字列関数 日本語(Shift-JIS)対応状況
LIKE 検索 バイナリ版では上述の通り制限あり
ソースコードを購入の方には、ワイルドカード(%, _)が全角半角を問わず
正しく文字単位にマッチするようパッチで対応可能
SQL文中の文字列関数 日本語対応状況
LOWER LCMapStringAをコールするため、そのまま日本語に対応
LENGTH 文字列の「バイト数」を返します
SUBSTRING バイト位置、バイト数指定による部分文字列抽出になります
TRIM 末尾から取り除く文字が2バイト文字の2バイト目に一致するケースで問題となります
POS AnsiStrPosをコールするため、そのまま日本語に対応
OCCURS AnsiStrPosをコールするため、そのまま日本語に対応
REPLACE AnsiStrPosをコールするため、そのまま日本語に対応

よって、今のところ対応できないケースは、以下のとおりです。

  • 全角半角交じり文字列の文字数をLENGTHで求めることはできません(バイト数≠文字数のため)
  • 全角文字列を含む項目からSUBSTRING関数で部分文字列を切り出す際に、文字位置・文字数を指定することはできません(バイト位置・バイト数で指定する必要があります)
  • 全角文字で終わる文字列項目の末尾からTRIM関数で、空白文字以外の1文字の半角文字列を取り除く場合、全角文字の2バイト目がその文字に一致して削られる可能性があります。(空白文字は全角文字の2バイト目に使われないため、TRIMで空白を取り除くのは問題なし)