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

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

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

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

Q&A

解決済

1回答

31886閲覧

Oracleで文字コードがUTF-8で、SJISで全角半角混在の文字列をバイト指定の固定長で出力したい

nikoken

総合スコア22

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

0グッド

0クリップ

投稿2016/12/19 16:15

タイトルの通り、Oracle 11g r2(LINUX)でNLS_LANGがUTF-8の環境で、データをファイル出力する必要がるのですが、そのファイルの仕様がSJISで固定長、しかもそのファイルのフィールドの中には全角半角混在の文字列があります。例えば「店舗名称」が70バイト、というものがあります。RPADは全角文字を2バイトで数えるし、SUSBTR系関数もバイト数が不定なので使えないと思っています。例えば、この環境でSJISで30バイトきっかりに全角半角交じりの文字列を出力するには、こうすれば実現できるのではといったアドバイスをお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

SUBSTRB 関数ならバイト単位で抽出しますが、例えば30バイト目がShift-JIS の 1byte 目だった場合どうするとか考えると、Oracle で抽出しただけではだめで、何かしら加工する必要があるのでは。

前に関わった仕事だと、「全角しか入れない」前提のマスターから抽出したデータで、前に全角空白を埋めて(いわゆる右詰をしたかった)合計20文字(40byte)に削ったが、データに「半角空白」が含まれていたために先頭に「@」が出てきたことがあります(全角空白=0x8140 なので、0x40 = @ が先頭に出てきた)

投稿2016/12/20 00:25

tacsheaven

総合スコア13703

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

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

nikoken

2016/12/23 01:48

回答ありがとうございます。全角半角混在だとむずかしいようですね。全部全角文字が前提なら、SUBSTRB関数だとOracleのNLS_LANGがUTF-8なので難しいですが、SUBSTR関数なら可能性がありそうですね。文字数調べた限りでは、OracleのRPAD,LPAD関数は、マルチバイト文字をSJIS環境で数えているようで、全角文字=2バイトと仮定すれば、UTF-8環境でも固定長出力なのでやってみようと思います。
tacsheaven

2016/12/23 05:25

混在だから難しいのではないのです。バイト数で制限するから難しいのですよ。 また、UTF-8 は1文字=1~4バイト(使用上は6バイトまであり得るが5バイト以上は現在未使用)の可変長です。もしかして UCS-2 と混同されていませんか?
nikoken

2016/12/25 12:46

そうですね。書き方を間違えました。バイト数で制限することが根本的な問題ですね。UTF-8が1文字のバイト数が不定であることは認識していますが、解決策としてすべてを全角で統一し、それをSJISに変換すれば1文字2バイトでカウントでき、SJISでの固定長出力ができると考えたのであのように書いてしまいました。ただ、ORACLEのCONVERT関数でこれをやろうとしたら「マッピングできません」とエラーが出ましたが。ご意見ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問