2
1

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の文字化け対策(UTF-8で使う)

Last updated at Posted at 2022-10-08

SQLclの文字化け対策(MS932で使う)(https://qiita.com/madilloar/items/caf0c15fbeae8a2c591c)
でやったことのUTF-8版です。

コマンドプロンプトでもchcp 65001にすればUTF-8が使えるのですが、サロゲートペア文字が文字化けしてしまいます。
Windows Terminalを使えばサロゲートペア文字もOKです。
あと、login.sqlSET ENCODING UTF-8を記述しないと文字化けます。

Oracle DBサーバの文字コード確認

Oracle DBサーバの文字コードはAL32UTF8です。

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           AL32UTF8                              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行が選択されました。

login.sqlの作成

例えば、%HOMEDRIVE%%HOMEPATH%\login.sqlを作ります。
SET ENCODING UTF-8を記述しないと文字化けます。login.sqlに記述しなくとも、ログインした後にSQL> のプロンプトが出た後でSET ENCODING UTF-8すればよいと思うのですが、なぜかlogin.sqlに入れておかないとダメでした。

login.sql
SET ENCODING UTF-8
SET SQLPROMPT "_USER@_CONNECT_IDENTIFIER> "
alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';

SQLcl起動用バッチファイルの作成

例えばc:\opt\bin\SQLclUTF8.batを作ります。

SQLclUTF8.bat
@echo off
chcp 65001
:: tnsnames.oraの場所
SET TNS_ADMIN=%HOMEDRIVE%%HOMEPATH%
:: SQLclの場所
SET AP_PATH=C:\opt\programs\sqldeveloper\sqldeveloper\bin
:: login.sqlの場所
SET SQLPATH=%HOMEDRIVE%%HOMEPATH%

%AP_PATH%\sql %1%

Windows Terminal上でSQLcl起動用バッチファイルを実行するのショートカットを作成

Windows Terminalをインストールしている前提で、そのインストールの仕方は省略します。

Windows Terminalのショートカットの引数に上記バッチファイルを記述します。

Windows Terminalのショートカットを作成

  • デスクトップで右クリックメニューを表示し「新規作成(X)」「ショートカット(S)」メニューアイテムをクリックします。
  • ショートカットの作成ダイアログが表示されるので、「項目の場所を入力してください(T):」テキストボックスで、wtと入力し「次へ(N)」ボタンをクリックします。
  • 「このショートカットの名前を入力してください(T):」テキストボックスでSQLclを入力し「完了(F)」をクリックします。
  • デスクトップにSQLclショートカットアイコンができているので、右クリックメニューで「プロパティ(R)」メニューアイテムをクリックします。~\AppData\Local\Microsoft\WindowsApps\wt.exeに次の引数をつけます。
~\AppData\Local\Microsoft\WindowsApps\wt.exe new-tab --colorScheme "Tango Light" "c:\opt\bin\SQLclUTF8.bat" "/nolog"
  • 「作業フォルダ(S)」テキストボックスに「%HOMEDRIVE%%HOMEPATH%」を入力して、「OK」ボタンをクリックします。

この例では、colorSchemeにはもともと設定されていたTago Light(背景色白の配色)を使っていますが、配色を自作して名前を付けて保存しておけば、それを利用できます。例えば、本番環境とテスト環境の色分けができます。

お試し用sql

上記のバッチファイルで起動したプロンプトから実行します。

insutf8.sql
SET ENCODING UTF-8

spool "c:\temp\insutf8.log"

conn a001/a001@ORCLPDB1_UTF8
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, '漢字(0x301C:〜)(0xFF5E:~)');
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

実行結果

SQLcl起動メッセージの文字化けは解消できなかったです。
「𩸽(ほっけ)」がサロゲートペア文字。DOS窓だとchcp 65001してもサロゲートペア文字は文字化けますが、
Windows Terminalなら大丈夫。
あと、SQLFORMAT ANSICONSOLEだと日本語が文字化けます。

Active code page: 65001


SQLcl: �y 10�� 08 20:27:56 2022�̃����[�X22.2 Production

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

SP2-0640: 接続されていません
@> cd c:\opt\bin
@> @insutf8.sql
接続しました.

Sessionが変更されました。

encoding "UTF-8"
SQL書式: ansiconsole

Table T_ORDER_ITEMが削除されました。


Table T_ORDER_ITEMは作成されました。


1行挿入しました。


1行挿入しました。


1行挿入しました。


1行挿入しました。


コミットが完了しました。

SQL書式: CSV
"ORDER_ITEM_ID","SHIPPING_ADDRESS_DESC"
1,"漢字(0x301C:〜)(0xFF5E:~)                    "
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,'漢字(0x301C:〜)(0xFF5E:~)
');
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 ����(0x301C:?)(0xFF5E:�`)
               2 ����
               3 ABC@!\~
               4 ?(�ق���)

A001@ORCLPDB1_UTF8>
2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?