日付定数のフォーマットで注意が必要です(米国製コンポーネント特有の注意点)
(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で空白を取り除くのは問題なし)