C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

PL/SQL(Oracle)の文字コード変換についての質問

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■93899 / inTopicNo.1)  PL/SQL(Oracle)の文字コード変換についての質問
  
□投稿者/ Mak (1回)-(2020/02/17(Mon) 16:02:26)

分類:[データベース全般] 

OracleのPL/SQLに関して質問させてください。

データベースVer:Oracle 11g 11.2.0.1.0
NLS_CHARACTERSET:AL32UTF8

上記環境においてINPUTのデータ:SJIS形式のCSVファイル(ファイル内に半角カナのデータあり)
を読み込ませて半角カナのデータを全角に変換後、UTF8に変換しているのですが、
下記は該当の処理の部分です。

WBUF := UTL_I18N.TRANSLITERATE (TRIM(R_CHOSAIN_TOTSUGOUEXCEL.SHIMEI_KANA), 'kana_hiragana');
WBUF := CONVERT(WBUF,'UTF8','JA16SJIS');

・WBUFはNVARCHAR2(1024)の変数
・R_CHOSAIN_TOTSUGOUEXCEL.SHIMEI_KANAはNVARCHAR2(120)の変数
・WBUFの処理結果を別テーブルにInsertしています。

処理後にでデータを確認すると(Object Browserを使用)
文字が化けて表示されます。
特に処理に問題は無いと思われるのですが、何か
問題はありますでしょうか?





引用返信 編集キー/
■93902 / inTopicNo.2)  Re[1]: PL/SQL(Oracle)の文字コード変換についての質問
□投稿者/ furu (19回)-(2020/02/17(Mon) 16:36:54)
No93899 (Mak さん) に返信
> WBUF := CONVERT(WBUF,'UTF8','JA16SJIS');

型変換なのに変換元と変換先が同じ変数?

WBUFはNVARCHAR2なのでUTF-16だから
'JA16SJIS'も'UTF8'もありえないと思いますが…
引用返信 編集キー/
■93903 / inTopicNo.3)  Re[2]: PL/SQL(Oracle)の文字コード変換についての質問
□投稿者/ Mak (2回)-(2020/02/17(Mon) 17:31:18)
furu様
返信ありがとうございます。
VARCHAR2とNVARCHARの違いを単純なバイト数の違いだけだと思っていました。
その後、プログラムを変更し下記のようにしてみたのですが、
文字コードの変換がうまくいきません。
処理が根本的に間違えているのでしょうか?


-- CSVファイル作成部品にて、CSVファイルを作成する。
FHANDLE := UTL_FILE.FOPEN(ファイルパス,ファイル名,'R',32767);

LOOP

    -- ファイルデータ取得
    UTL_FILE.GET_LINE( FHANDLE, VBUF);

    -- ↓第1引数:文字列バッファ 第2引数:区切り文字 第3引数:取得列数 第4引数:代入先 
    IRTN := CSV切り出し自作関数(VBUF, ',', 2, R_CHOSAIN_TOTSUGOUEXCEL.SHIMEI_KANA);
    
    -- 全角ひらがなに変換
    WBUF := UTL_I18N.TRANSLITERATE (TRIM(R_CHOSAIN_TOTSUGOUEXCEL.SHIMEI_KANA), 'kana_hiragana'); 
    
    -- SJIS→UTF8に変換
    WBUF2 := CONVERT(WBUF,'UTF8','JA16SJIS');

    -- テーブル追加
    R_CHOSAIN_TOTSUGOUEXCELをCHOSAIN_TOTSUGOUEXCELにINSERT

END LOOP;

VBUFはVARCHAR2(4096);
WBUFはVARCHAR2(4096);
WBUF2はVARCHAR2(4096);
R_CHOSAIN_TOTSUGOUEXCEL.SHIMEI_KANAはNVARCHAR2(120)


引用返信 編集キー/
■93905 / inTopicNo.4)  Re[3]: PL/SQL(Oracle)の文字コード変換についての質問
□投稿者/ Mak (3回)-(2020/02/17(Mon) 17:45:10)
追記です。

CSV切り出し自作関数にてNVARCHAR2の変数を使用している部分が
それが変換の失敗の原因となっていました。
NVARCHAR2からVARCHAR2に変更することにより問題が解消しましたので、
本件を解決済みとさせていただきます。

この度はありがとうございました。


解決済み
引用返信 編集キー/
■93906 / inTopicNo.5)  Re[3]: PL/SQL(Oracle)の文字コード変換についての質問
□投稿者/ 魔界の仮面弁士 (2561回)-(2020/02/17(Mon) 18:05:16)
# 解決済みマークは付けたままにしておきます。

No93899 (Mak さん) に返信
> データベースVer:Oracle 11g 11.2.0.1.0
> NLS_CHARACTERSET:AL32UTF8

NVARCHAR2 型を話題にしているのですから、
NLS_CHARACTERSET ではなく
NLS_NCHAR_CHARACTERSET を提示するべきかと思います。
(おそらく AL16UTF16 だとは思いますが)

たとえば SHIMEI_KANA の内容が、'オラクル' (の半角カナ表記)だった場合、
『 DUMP(R_CHOSAIN_TOTSUGOUEXCEL.SHIMEI_KANA) 』は、下記の文字列を返しているのではないでしょうか。

'Typ=1 Len=8 CharacterSet=AL16UTF16: ff,75,ff,97,ff,78,ff,99'


No93903 (Mak さん) に返信
> 文字コードの変換がうまくいきません。

リファレンスにも明記されていますように、
CONVERT に渡して変換する方法は避けてください。
https://docs.oracle.com/cd/E16338_01/server.112/b56299/functions034.htm

NVARCHAR2 型同士で変換する関数ではなく、
RAW や BLOB を扱う関数の利用を検討してみてください。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ