- PR -

ORACLE への UNICODE 書込みにて一部ロスト

1
投稿者投稿内容
MURAOKA
会議室デビュー日: 2005/03/04
投稿数: 2
投稿日時: 2005-03-04 12:16
はじめて投稿します。よろしくお願いします。
掲題について、助言頂きたく投稿しました。

[現象]
Pro*C にてUNICODE文字をDB登録する場合、UNICODEに全角スペース
が混じっている場合は、以降の文字が全く登録されない。

[ソース(一部省略)]
int AAA[n];
char characterset is nchar_cs XXX[n][40];

memset(&XXX[n][0],0x00,sizeof(XXX));

EXEC SQL FOR n:
INSERT INTO TABLE VALUES(:AAA,XX);

[確認済事項]
1.XXXは、ダンプにて目的のUNICODE文字が全て入っている
事を確認できた。
2.全角スペース以外(ex:"、"など)は登録できる。
3.TO_NCHAR(:AAA)は、特に変化なし。

[原因???]
DBへのINSERT時はホスト変数内の0x00(null)が終了文字とさ
れている。
全角スペース(UNICODE)=0x3000ですが、1Byteに分解すると
30 と 00 となり、00 はnullと判断されてしまっているの
ではないか。

[環境]
UNICODE : UTF16 BIGENDIAN
DB : ORACLE 9i (9.2.0.5.0)
SJIS / NVARCHAR2 混在
OS : HP-UX
コンパイラ : HP C (11.11.08)
LANG : ja_JP.SJIS
NLS_LANG : japanese_japan.JA17SJISTILDE
NLS_NCHAR: AL16UTF16
NLS_LOCAL: NO

[その他]
1.他APはSJISをUNICODEへDB書込みしているが、上記のスペース問題は
発生していない。暗黙的に変換された方が安全??
2.このAPはUNICODEにて書込みを行いたいため、UNICODE->SJIS変換
は行わない。外字使用の為。

上記のような状態で非常に困っています。対処方法をご存知の方
おられましたら助言頂けますよう、よろしくお願いします。
MURAOKA
会議室デビュー日: 2005/03/04
投稿数: 2
投稿日時: 2005-03-15 08:03
自己レスです。

プリコンパイラの設定により、固定長の文字列を書込み事ができました。
これによって、null(0x00)を気にしなくても、書き込みたい文字列全て
をDBに反映できます。

[makefile]
PROCPLSFLAGS ... CHAR_MAP=VARCHAR2

ところが、不可思議な現象がでてしまって。。
not null項目にSPACE(0x20)のみを書き込もうとすると、
SQLCODE=-1400("nullは挿入できません")が発生。
逆に、not null項目にnullを書き込むと上記エラーは回避できます。
ただし、やはり難点があって、SELECT DUMP(...)で確認したところ
上記のやり方で書き込まれたものは、length=2,0,0 ????
0(この場合はnull?)というコードの文字が2つ書き込まれた。

上記のデータをAPで確認するとnullという認識をしてしまうのか、
エラーとなってしまう。。(まだ推測の域ですが)

なぜ、spaceはnullと認識され、nullはnot null項目に書き込めるのか??
この現象はまだ発生したばかりなので、これから解析してみます。

ご存知の方ありましたら、書込みお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)