SQL*Plusの後継といってよいと思うツールのSQLcl。コマンドラインで使うときに便利だけれど、参考URLとかがUTF-8だったので、何とかMS932でやれないかと文字化けで苦労したので、その覚書。
SQLcl単体でもダウンロードできますが、SQL Developerに同梱されてるもので試してます。
あと、SQL DeveloperはJRE同梱版をお勧めします。JREのバージョンが違うと動かないので。
テストに利用したOracleのDBの文字コードはJA16SJISTILDEです。
SQL> select * from v$nls_parameters;
PARAMETER VALUE CON_ID
__________________________ _____________________________ _________
NLS_LANGUAGE JAPANESE 3
NLS_TERRITORY JAPAN 3
NLS_CURRENCY \ 3
NLS_ISO_CURRENCY JAPAN 3
NLS_NUMERIC_CHARACTERS ., 3
NLS_CALENDAR GREGORIAN 3
NLS_DATE_FORMAT YYYY/MM/DD HH24:MI:SS 3
NLS_DATE_LANGUAGE JAPANESE 3
NLS_CHARACTERSET JA16SJISTILDE 3
NLS_SORT BINARY 3
NLS_TIME_FORMAT HH24:MI:SSXFF 3
NLS_TIMESTAMP_FORMAT RR-MM-DD HH24:MI:SSXFF 3
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR 3
NLS_TIMESTAMP_TZ_FORMAT RR-MM-DD HH24:MI:SSXFF TZR 3
PARAMETER VALUE CON_ID
_________________________ ____________ _________
NLS_DUAL_CURRENCY \ 3
NLS_NCHAR_CHARACTERSET AL16UTF16 3
NLS_COMP BINARY 3
NLS_LENGTH_SEMANTICS BYTE 3
NLS_NCHAR_CONV_EXCP FALSE 3
19行が選択されました。
参考URL
https://scrapbox.io/cybernote/SQLcl
DOS窓で使うためのバッチファイル作成
次のバッチファイルを作成して、ここからSQLclを起動する。環境変数やパスを設定する案もあり。
@echo off
:: tnsnames.oraの場所
SET TNS_ADMIN=%HOMEDRIVE%%HOMEPATH%
:: クライアント側の文字
:: SET NLS_LANG=Japanese_Japan.JA16SJISTILDE
:: spoolのエンコーディング
:: SET JAVA_TOOL_OPTIONS="-Duser.language=ja"
:: SQLclの場所
SET AP_PATH=C:\opt\programs\sqldeveloper\sqldeveloper\bin
:: login.sqlの場所
SET SQLPATH=%HOMEDRIVE%%HOMEPATH%
%AP_PATH%\sql /nolog
SQL Developerはc:\opt\programs\sqldeveloper
にインストールしている前提。
tnsnames.oraは%HOMEDRIVE%%HOMEPATH%
直下にある前提。
2022/10/08 NLS_LANGとJAVA_TOOL_OPTIONSを指定せずとも文字化けしなかった。
文字化け対策のポイントは次の2つ。
ポイント1:NLS_LANGに"Japanese_Japan.JA16SJISTILDE"を入れる。画面の文字化け対策。
ポイント2:JAVA_TOOL_OPTIONSに"-Duser.language=ja -Dfile.encoding=MS932"を入れる。特にspoolする際の文字化け対策としてfile.encodingの指定が重要。spoolのデフォルトエンコーディングがUTF-8っぽい。
お試し用のsqlファイル
次のsqlファイルを上記バッチから動かします。
SET ENCODING MS932
spool "c:\temp\insms932.log"
conn a001/a001@ORCLPDB1
SHOW ENCODING
SHOW SQLFORMAT
drop table t_order_item cascade constraint;
create table t_order_item (
order_item_id decimal(7,0) not null
, shipping_address_desc char(50)
, constraint pk_t_order_item primary key ( order_item_id )
)
;
insert into t_order_item (order_item_id, shipping_address_desc) values(1, '漢字(0x8160:~)');
insert into t_order_item (order_item_id, shipping_address_desc) values(2, 'カタカナ');
insert into t_order_item (order_item_id, shipping_address_desc) values(3, 'ABC@!\~');
insert into t_order_item (order_item_id, shipping_address_desc) values(4, '(ほっけ)');
commit;
SET SQLFORMAT CSV
SHOW SQLFORMAT
select * from t_order_item;
SET SQLFORMAT INSERT
SHOW SQLFORMAT
select * from t_order_item;
SET SQLFORMAT ANSICONSOLE
SHOW SQLFORMAT
select * from t_order_item;
spool off
実行結果
接続しました.
Sessionが変更されました。
encoding "MS932"
SQL書式: ANSICONSOLE
Table T_ORDER_ITEMが削除されました。
Table T_ORDER_ITEMは作成されました。
1行挿入しました。
1行挿入しました。
1行挿入しました。
1行挿入しました。
コミットが完了しました。
SQL書式: CSV
"ORDER_ITEM_ID","SHIPPING_ADDRESS_DESC"
1,"漢字(0x8160:~) "
2,"カタカナ "
3,"ABC@!\~ "
4,"(ほっけ) "
SQL書式: INSERT
REM INSERTING into T_ORDER_ITEM
SET DEFINE OFF;
Insert into T_ORDER_ITEM (ORDER_ITEM_ID,SHIPPING_ADDRESS_DESC) values (1,'漢字(0x8160:~) ');
Insert into T_ORDER_ITEM (ORDER_ITEM_ID,SHIPPING_ADDRESS_DESC) values (2,'カタカナ ');
Insert into T_ORDER_ITEM (ORDER_ITEM_ID,SHIPPING_ADDRESS_DESC) values (3,'ABC@!\~ ');
Insert into T_ORDER_ITEM (ORDER_ITEM_ID,SHIPPING_ADDRESS_DESC) values (4,'(ほっけ) ');
SQL書式: ANSICONSOLE
ORDER_ITEM_ID SHIPPING_ADDRESS_DESC
________________ _____________________________________________________
1 漢字(0x8160:~)
2 カタカナ
3 ABC@!\~
4 (ほっけ)