From: KUBO Takehiro Date: 2002-12-03T13:35:02+09:00 Subject: [ruby-list:36643] Re: Ruby/OCI8 の動作について 久保@茅ヶ崎市です。 "Mitsuyasu Ichimura" writes: > 市村と申します。 > > Ruby/OCI8 を利用させて頂いていますが、下記のような動作が > 確認されましたので、報告させて頂きます。 ありがとうございます。 公開しても数件ほどしか反応ないので、使っている人はほとんどいないのでは ないかと不安でした。(^^;) > 次のようなテーブル > > create table hogehoge ( > col1 varchar2(2), > col2 varchar2(50)); > > に、次のようなデータをインサートします。(文字コードは EUC > です。) > > insert into hogehoge values ('漢', '字'); > > ここで、UTF-8 でデータを取り出すために、NSL_NALG を > Japanese_Japan.UTF8 に設定して、Ruby/OCI8 でデータを取り > 出すと、 > > col1 | col2 > ----------- > | 字 > > となり、varchar2(2) の型のデータが取り出せません。 > varchar2(50) の型のデータは取り出せますので、UTF-8 になっ > て文字のバイト数が増えたことによって、文字が取り出せなく > なっているものと思われます。 なるほど。 上位APIを使っているのでしたら、oci8.rb の 361: when OCI_TYPECODE_VARCHAR 362: @stmt.defineByPos(i, String, datasize) 363: when OCI_TYPECODE_CHAR 364: @stmt.defineByPos(i, String, datasize) を、 361: when OCI_TYPECODE_VARCHAR 362: @stmt.defineByPos(i, String, datasize * 2) 363: when OCI_TYPECODE_CHAR 364: @stmt.defineByPos(i, String, datasize * 2) とするとどうなりますか? 今、手元の Oracle がないので試験できないのですが、varchar2(2) なので datasize が 2 になっていたのでしょう。 datasize * 2 ってのも ad-hoc だし、SJIS 半角カナは UTF-8 だと 3倍にな るのでこれでも足りないし、なんかいい方法ないかな? > 以上、ご報告でした。 どうもありがとうございました。 では、再見 -- 神奈川県茅ヶ崎市在住 久保 健洋 email: kubo@jiubao.org web: http://www.jiubao.org GnuPG fingerprint = 5F7B C8EF CA16 57D0 FDE1 9F47 C001 1F93 AC08 2262