[#36686] 1.1 < 61.1 - 60.0 — Shin-ichiro HARA <sinara@...>

原です。

19 messages 2002/12/06

[#36770] www.ruby-lang.orgリニューアル準備のお知らせ — TADA Tadashi <sho@...>

ruby-lang.orgのwebmasterチームでは、タイムリーな情報提供と使いやすい

11 messages 2002/12/16

[ruby-list:36643] Re: Ruby/OCI8 の動作について

From: KUBO Takehiro <kubo@...>
Date: 2002-12-03 04:35:02 UTC
List: ruby-list #36643
久保@茅ヶ崎市です。

"Mitsuyasu Ichimura" <ichimura@jimu.hokudai.ac.jp> 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

In This Thread