- - PR -
ORACLE への UNICODE 書込みにて一部ロスト
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 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, [確認済事項] 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変換 は行わない。外字使用の為。 上記のような状態で非常に困っています。対処方法をご存知の方 おられましたら助言頂けますよう、よろしくお願いします。 |
|
投稿日時: 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
