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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

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

Java

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

Spring Boot

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

Q&A

解決済

3回答

11314閲覧

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

euledge

総合スコア2404

Oracle

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

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2018/07/19 03:37

編集2018/07/19 05:34

前提・実現したいこと

既存の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)

yaml

1datasource: 2 platform: Oracle12c 3 driverClassName: oracle.jdbc.driver.OracleDriver 4 url: jdbc:oracle:thin:@xx.xx.xx.xx:yyyy 5 username: xxxx 6 password: xxxx 7 jpa: 8 database-platform: org.hibernate.dialect.Oracle12cDialect 9 show_sql: false 10 hibernate: 11 dialect: org.hibernate.dialect.Oracle12cDialect

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/19 04:17 編集

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

回答3

0

ベストアンサー

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

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

投稿2018/07/19 04:27

編集2018/07/29 07:35
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

euledge

2018/07/19 04:38

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

2018/07/19 04:49

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

2018/07/19 04:55

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

2018/07/19 05:22 編集

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

0

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

投稿2018/07/19 04:17

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

euledge

2018/07/19 04: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で格納できるという意味でしょうか?そうであればこれで解決できそうなのですが
Orlofsky

2018/07/19 05:02

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

2018/07/19 09:16

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

2018/07/19 09:57

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

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. 文字コード確認

sql

1SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET' 2// 結果 JA16SJIS

検証を行うテーブル

sql

1create table TEST ( 2 NORMAL_TEXT VARCHAR2(20) 3 , NLS_TEXT NVARCHAR2(20) 4);

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

build.gradle

groovy

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

application.yml

yaml

1spring: 2 datasource: 3 url: jdbc:oracle:thin:@//127.0.0.1:1521/XE 4 username: test 5 password: test 6 driverClassName: oracle.jdbc.OracleDriver

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

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

java

1@SpringBootApplication 2public class OracleTestApplication implements CommandLineRunner { 3 4 @Autowired 5 JdbcTemplate jdbcTemplate; 6 7 @Override 8 public void run(String... strings) throws Exception { 9 10 String text = "あいうえお"; 11 jdbcTemplate.update("INSERT INTO test VALUES (?, ?)", text, text); 12 } 13 14 public static void main(String[] args) { 15 SpringApplication.run(OracleTestApplication.class, args); 16 } 17}

結果

shell

1oracle@0690176d4c2d:~$ env 2ORACLE_SID=XE 3ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe 4USER=oracle 5PWD=/u01/app/oracle 6HOME=/u01/app/oracle 7MAIL=/var/mail/oracle 8SHELL=/bin/bash 9TERM=xterm 10SHLVL=1 11LOGNAME=oracle 12PATH=/u01/app/oracle/product/11.2.0/xe/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games 13_=/usr/bin/env 14oracle@0690176d4c2d:~$ sqlplus test/test 15 16SQL*Plus: Release 11.2.0.2.0 Production on Sat Jul 21 16:10:07 2018 17 18Copyright (c) 1982, 2011, Oracle. All rights reserved. 19 20 21Connected to: 22Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 23 24SQL> select * from test; 25 26NORMAL_TEXT NLS_TEXT 27-------------------- -------------------- 28????? ????? 29 30SQL>

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

shell

1Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 2oracle@0690176d4c2d:~$ export NLS_LANG=Japanese_Japan.UTF8 3oracle@0690176d4c2d:~$ sqlplus test/test 4 5SQL*Plus: Release 11.2.0.2.0 Production on 土 721 16:11:54 2018 6 7Copyright (c) 1982, 2011, Oracle. All rights reserved. 8 9 10 11Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 12に接続されました。 13SQL> select * from test; 14 15NORMAL_TEXT 16------------------------------------------------------------ 17NLS_TEXT 18------------------------------------------------------------ 19あいうえお 20あいうえお 21 22 23SQL>

saziさんのコメントに

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

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

投稿2018/07/21 16:16

編集2018/07/21 16:18
euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問