JDBC OCI Driver を使用して 半角カナ文字を取得すると、文字が途中で切れます。
環境
- サーバー OS: Windows Server 2008 R2 (64bit)
- クライアント OS: Windows7 (64bit)
- Database: Oracle Database 12c Release 1 (12.1.0.1.0) for Microsoft Windows (x64)
- エディション: Enterprise Edition
- ライセンス: OTN開発者ライセンス
- Client: Oracle Database 12c Release 1 Client (12.1.0.1.0) for Microsoft Windows (x64)
- Java: jdk-7u17
- NLS_CHARACTERSET: JA16SJISTILDE
詳細
データ型が char (あるいは varchar) のカラムに、半角カナのみで構成された文字を格納しておき、
そのカラムから値を取得すると、文字が途中で切れます。
たとえば、サイズが 2000 バイトのカラムに半角カナの "ア" を格納しておき、
JDBC OCI Driver を使用して (ResultSet#getString 等で) データを取得すると、
取得した文字列を sjis で換算して、1333 バイトまでしか取得できませんでした。
取得できないのは、私の調べた限り半角カナのみで、
ひらがな、アルファベットについては、正しく値を取得できました。
一方で JDBC Thin Driver を使用すると、半角カナの値を正しく 2000 バイト取得することができました。
取得できたバイト数から推測すると、
OCI を経由する際に、半角カナが一度、UTF-8 に変換されているのではないかと思いますが、
正確な原因は特定できておらず、
値を正しく取得する方法も現在模索中です。
また、サーバー・クライアント共に、11gR2 を使用する環境では上記の問題は発生せず、
Oracle Database Client 11gR2 から、12C サーバーに接続しても、正しく値が取得できます。
さらに、11gR2 のサーバーに、12c の JDBC OCI Driver を使用して値を取得すると、
半角カナのみ、データが切れてしまいます。
このことから、問題はクライアント側 (Oracle Database Client 12c、ドライバ、何かしらの設定?) に
限られるのではないかと考えています。
なお、値の取得の実装方法として、
ResultSet#getString, ResultSet#getBinaryStream, ResultSet#getCharacterStream のいずれによっても
結果は変わりませんでした。
もし、上記の件について何かご存知の方がいらっしゃいましたら、ご教示いただけますでしょうか。