質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Java

    13751questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Oracle

    601questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

  • Spring Boot

    489questions

    Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Oracleのテーブルに異なるキャラクタセットの文字列を入れたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 275

euledge

score 1787

 前提・実現したいこと

既存のOracleのデータベースがキャラクタセット JA16SJISで作成されており、その中のテーブルを新規作成してアプリケーションから文字列を入出力したい。

アプリケーションはSpringBootで作成したプログラムで JDBC ,JPA hibernate を使用してデータベースに接続したいと思っています。

 試したこと

テーブル単位、もしくは接続ユーザーやテーブルスペース単位でキャラクターセットを変更する方法を調べてみましたがOracleではそのような方法を見つけることが出来ませんでした。

Javaアプリケーション起動時に環境変数 NLS_LANGを設定すればよいかと思いましたが、もうひとつのOracleのデータベース(キャラクターセットはUTF-8)にも同じアプリケーションで接続する必要があるためこの方法は取れないと思っています。

調べたサイト

 質問事項

  • JDBCの接続設定のようなもので読み書きする際の文字列のキャラクタセットを指定することは出来ますでしょうか?
  • またはユーザー、テーブル作成時に保存される文字列のキャラクターセットを指定することは出来ますでしょうか?

 環境

  • JDBCドライバー ojdbc7 12.1.0.2
  • Java8
  • SpringBoot 1.5.6.RELEASE
  • spring-boot-starter-data-jpa

 DB接続の設定(application.yaml)

datasource:
    platform: Oracle12c
    driverClassName: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@xx.xx.xx.xx:yyyy
    username: xxxx
    password: xxxx
    jpa:
      database-platform: org.hibernate.dialect.Oracle12cDialect
      show_sql: false
      hibernate:
      dialect: org.hibernate.dialect.Oracle12cDialect
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/07/19 13:16 編集

    このままでは丸投げ質問(非推奨質問の代表格です)となってしまうので、自身が調べていく中でやってみたコード(またはその内容)をご提示ください。その上で「何が」「どう」分からなかったのか記載してください。 https://teratail.com/help/question-tips

    キャンセル

  • Orlofsky

    2018/07/19 14:02

    URLは https://teratail.com/help#about-markdown の[リンク]を使ってください。

    キャンセル

回答 3

checkベストアンサー

+2

異なるキャラクタセットのデータを持つのは、暗号化されている項目に例えることが出来ます。
取り出しの際には復号する必要があり、単純に検索もできません。

投入の際に文字コードを変換したほうが良いと思いますけど、そうしない理由のほうが気になります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 13:38

    同一アプリケーションを別々のサイトに展開するということをしているのですがDBサーバーについては、ユーザーが用意し指定されたもの使用することになってしまったため、このようなことがおきています。

    キャンセル

  • 2018/07/19 13:49

    同一アプリケーションで複数のDBに同時接続し、そのDB毎にキャラセットが違うということですか?

    キャンセル

  • 2018/07/19 13:55

    現在困っていることは同一のアプリケーション(Java なので jarの配布)は同じものでデプロイ先のOracleのDBのcharsetによって異なるのですがこの場合は環境変数NLS_LANGで対応できるかと思っています。
    但し、DBの管理をこちらで握れないケースがあるので、同一アプリケーションで異なるcharsetのDBに接続するケースも今後あるかもという点であらかじめ対応策を把握しておきたいです。

    キャンセル

  • 2018/07/19 14:18 編集

    文字コードの変換はjdbcドライバが担ってくれますので、環境に応じてjdbcドライバー絡み(接続先のキャラセットの指定も含めて)を差し替えるという作業になるかと。

    キャンセル

+1

Oracleは複数のキャラクタセットを同居させることができません。utf-8 を使いたいなら AL32UTF8 を使います。SJISでは2バイトのマルチバイト文字がAL32UTF8では3バイトになって桁あふれすることもあります。
Oracleのばーっジョンによって変更する方法が違いますので、お使いのバージョンのグローバリゼーション・サポート・ガイド キャラクタ・セットの移行データベース・キャラクタセットを変更するを参考にしてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 13:44

    [OTN -NCHARおよびNVARCHAR2データ型 ](http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05765-03/datatype.htm#16545) を見たのですが

    NCHARとNVARCHAR2データ型のキャラクタ・セットは、AL16UTF16またはUTF8のいずれかのみです

    という記述があります。これはデータベースのキャラクタセットに依存せずunicodeで格納できるという意味でしょうか?そうであればこれで解決できそうなのですが

    キャンセル

  • 2018/07/19 14:02

    最初に書いたようにOracleは複数のキャラクタセットの同居はできません。

    キャンセル

  • 2018/07/19 14:28

    そうするとデータベースをJA16SJISで作成したとき、NVARCHARにはunicodeではなくDatabaseのCharset依存で入るということでしょうか?

    参考 https://qiita.com/kawasima/items/e958adb75cfd64be45fd

    キャンセル

  • 2018/07/19 18:16

    実際に動作確認されては?長年Oracleを使っていますが、NVARCHAR, NVARCHAR2型を使っているシステムの移行ってやったことがありません。
    昔バグでもあったのかもしれませんが、わたしは情報がありません。

    キャンセル

  • 2018/07/19 18:57

    そうですね、環境用意して確かめてみます。

    キャンセル

0

環境作成して検証してみましたので、ご報告まで

 検証環境の準備

  1. Oracle Database 11g Express Edition(XE) はdockerで wnameless/docker-oracle-xe-11g を使用してサーバー環境を作成。
  2. Oracle 11g XEのデフォルトの文字コードはUTF-8のため、Qiita - Oracle 11g XEのDBをShift JIS化する の記事の手順に従い JA16SJIS のデータベースを再作成する。
  3. 文字コード確認
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET'
// 結果 JA16SJIS

検証を行うテーブル

create table TEST (
  NORMAL_TEXT VARCHAR2(20)
  , NLS_TEXT NVARCHAR2(20)
);

 Spring bootで検証用プログラムを作成

 build.gradle

compile('com.oracle:ojdbc6:11.2.0.3')

 application.yml

spring:
  datasource:
    url: jdbc:oracle:thin:@//127.0.0.1:1521/XE
    username: test
    password: test
    driverClassName: oracle.jdbc.OracleDriver

 Insert実行するためのプログラム

下記プログラムをEclipse上で作成し実行しました。

@SpringBootApplication
public class OracleTestApplication implements CommandLineRunner {

  @Autowired
  JdbcTemplate jdbcTemplate;

  @Override
  public void run(String... strings) throws Exception {

    String text = "あいうえお";
    jdbcTemplate.update("INSERT INTO test VALUES (?, ?)", text, text);
  }

  public static void main(String[] args) {
    SpringApplication.run(OracleTestApplication.class, args);
  }
}

 結果

oracle@0690176d4c2d:~$ env
ORACLE_SID=XE
ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
USER=oracle
PWD=/u01/app/oracle
HOME=/u01/app/oracle
MAIL=/var/mail/oracle
SHELL=/bin/bash
TERM=xterm
SHLVL=1
LOGNAME=oracle
PATH=/u01/app/oracle/product/11.2.0/xe/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
_=/usr/bin/env
oracle@0690176d4c2d:~$ sqlplus test/test

SQL*Plus: Release 11.2.0.2.0 Production on Sat Jul 21 16:10:07 2018

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> select * from test;

NORMAL_TEXT          NLS_TEXT
-------------------- --------------------
?????                ?????

SQL>


結果文字化けしていましたが、環境変数 NLS_LANG=Japanese_Japan.UTF8を設定して再度SELECT文を発行したところ以下のように文字化けせずに表示できました。

Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
oracle@0690176d4c2d:~$ export NLS_LANG=Japanese_Japan.UTF8
oracle@0690176d4c2d:~$ sqlplus test/test

SQL*Plus: Release 11.2.0.2.0 Production on 土 7月 21 16:11:54 2018

Copyright (c) 1982, 2011, Oracle.  All rights reserved.



Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> select * from test;

NORMAL_TEXT
------------------------------------------------------------
NLS_TEXT
------------------------------------------------------------
あいうえお
あいうえお


SQL>

saziさんのコメントに

文字コードの変換はjdbcドライバが担ってくれます

とありましたので、この検証結果の内容と一致したものと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13751questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Oracle

    601questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

  • Spring Boot

    489questions

    Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。