0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQLclの文字化け対策(MS932で使う)

Last updated at Posted at 2022-09-05

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

https://docs.oracle.com/cd/F40596_01/sqcug/working-sqlcl.html#GUID-7AEF14E8-EA31-49A8-9A11-A9E765E2C7B6

DOS窓で使うためのバッチファイル作成

次のバッチファイルを作成して、ここからSQLclを起動する。環境変数やパスを設定する案もあり。

sqlcl.bat
@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ファイルを上記バッチから動かします。

insms932.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 (ほっけ)                                                 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?