Oracleのnvarcharのサイズの表示が二倍、三倍!?

846 views
Skip to first unread message

kubo

unread,
Oct 21, 2013, 11:17:47 AM10/21/13
to DBFluteユーザの集い
jfluteです。

seasar-user-MLにて、
SchemaHTMLに表示されるOracleのnvarcharの型のサイズが、
create文で指定したやつの二倍や三倍になる現象が報告されています。

で、確かに以前そうだったと記憶しているのですが、
jfluteのローカルでのOracle環境だと、
32と指定してたら32と表示されているので、
あれっ...これってどうだったんだっけなぁと...ちょと失念。

Oracle11gにアップグレードして直ったのかなと勝手に思ってたら、
投稿者の方が、Oracle11gで試してもダメだったようで。
(ojdbc6.jarを利用していても)

もし、Oracleユーザーの方々で nvarchar を使っている人がいたら、
その辺どうなっているか情報を提供して頂けるとうれしいです。

takiguchi

unread,
Oct 21, 2013, 9:04:43 PM10/21/13
to dbf...@googlegroups.com
たきぐちです。

Oracleの文字列型の長さセマンティクスは、バイト長か文字数長かのどちらかになります。
11gはどうなのかは知りませんが、10gあたりまではvarchar2型のデフォルトはバイトセマンティクスのため、
varchar2(10) と指定すると「10バイト」のサイズになります。
これをキャラクタセマンティクスにすると、同じvarchar2(10)でも、
文字エンコーディングによりバイト数が「20バイト」とか「40バイト」になります。

nvarchar2は、デフォルトでキャラクタセマンティクスとなるため、
上記のように「指定した長さとバイトサイズが違う」という結果になるのだと思います。

詳しくはOracleのドキュメントで。

で、ここまで書きましたが、JDBCで「指定した長さ」を取る方法は分かりません><


2013/10/22 kubo <dbf...@gmail.com>

--
このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、dbflute+u...@googlegroups.com にメールを送信します。
このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/dbflute からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

takiguchi

unread,
Oct 21, 2013, 9:15:22 PM10/21/13
to dbf...@googlegroups.com
って、seasar-userの方見たら、JDBCドライバのバージョン上げたら治ったみたいですね。
Oracleェ・・・


2013/10/22 takiguchi <tak...@gmail.com>

西山はじめ

unread,
Oct 21, 2013, 9:25:29 PM10/21/13
to dbf...@googlegroups.com
西山です。

11gでもR1まではvarchar2のデフォルトはbyteでした。

それはそれとして、OracleさんはDBのバージョンとJDBCのバージョン(マイナーバージョンまで)は合わせておかないとなんかダメ(微妙に動く)っていう感じだったと思います。

もしかしたらR2からデフォルト変わっていて、JDBCから取れる情報が変わっていて正しい情報が取れなくなっていたのかもしれませんが、推測にすぎないのでなんとも言えません。

--
西山はじめ


2013年10月22日 10:15 takiguchi <tak...@gmail.com>:

kubo

unread,
Oct 22, 2013, 1:06:32 AM10/22/13
to DBFluteユーザの集い
jfluteです

たきぐちさん、ありがとう。
バイト長か文字数長かって、本当にややこしい問題ですね。
まあ、そのうち時代が解決してくれるのかなぁ...

西山くん、ありがとう。

> 11gでもR1まではvarchar2のデフォルトはbyteでした

そ・う・な・ん・だぁー
最近、MySQLばかり触ってるから意識してなったなぁ...


いずれにせよ、JDBCドライバのアップグレードでなんとかなったので、
よかったよかったです。たまにはJDBCドライバで解決される問題って
のもあるんだなぁと(^^


2013/10/22 西山はじめ <hajim...@gmail.com>:

awaawa

unread,
Oct 23, 2013, 8:41:53 PM10/23/13
to dbf...@googlegroups.com
awaawaです。

それはそれとして、OracleさんはDBのバージョンとJDBCのバージョン(マイナーバージョンまで)は合わせておかないとなんかダメ(微妙に動く)っていう感じだったと思います。

ジャストアイディアなんですが、DBFluteでOracleのバージョンとjarのバージョンの整合性チェックってどうでしょーか。
警告ログを出すレベルで。
(実行時がいいですが、影響を考え、厳密ではないですが、自動生成時でも。
自動生成時は現状バージョン表示をしていますし。)

if (metaData.getDatabaseMajorVersion() > metaData.getDriverMajorVersion()
         || (metaData.getDatabaseMajorVersion() == metaData.getDriverMajorVersion()
                 && metaData.getDatabaseMinorVersion() > metaData.getDriverMinorVersion())) {
     // 警告
}

※getDatabaseProductVersion、getDriverVersionの文字を解析する方がバージョンは細かく出せますが。

2013年10月22日 14:06 kubo <dbf...@gmail.com>:

kubo

unread,
Oct 24, 2013, 2:33:33 PM10/24/13
to DBFluteユーザの集い
jfluteです

> ジャストアイディアなんですが、DBFluteでOracleのバージョンとjarのバージョンの整合性チェックってどうでしょーか。
Thanks, Idea.
ただ、警告ログ出してもあまり見られることがないと思うので、ちょっと弱いかな。
自動生成時だけの話であれば、自動生成に支障がない程度のズレであればOKなので、
ひとまずは様子を見たいと。



2013/10/24 awaawa <p1us3i...@gmail.com>:

awaawa

unread,
Oct 25, 2013, 1:25:13 AM10/25/13
to dbf...@googlegroups.com
awaawaです。

確かに見られない可能性が高いですね。。。
了解です。

2013年10月25日 3:33 kubo <dbf...@gmail.com>:

Yuichi Kaneko

unread,
Oct 25, 2013, 2:42:38 AM10/25/13
to dbf...@googlegroups.com
Kankoです。

Oracleの話題じゃなくて恐縮ですが、postgresqlのvarcharは、キャラクタセマンティクスだったりします。
というか、バイトセマンティクスの文字列型は存在しない。。。。



2013年10月25日 14:25 awaawa <p1us3i...@gmail.com>:



--
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
金子 雄一  Yuichi Kaneko
E-mail : yuichi...@gmail.com
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
Reply all
Reply to author
Forward
0 new messages