[Oracle] キャラクタセット(文字コード)を確認する方法

Oracle

日本語のようなマルチバイト文字を扱う場合には、
データベースを作成する時に正しいキャラクタセット(文字コード)を指定する必要があります。

本ページはOracle Databaseのキャラクタセットを確認する方法を載せています。
あわせて、SQL*Plusで文字化けが発生した際に確認すべき項目についても記載しています。

キャラクタセットの確認

現在リリースされているOracle Databaseは、マルチテナント構成が推奨されているため、
キャラクタセットを確認する場合は、
CDB(Container Database)とPDB(Pluggable Database)の両方を確認する必要があることに注意します。

CDBのキャラクタセット

CDBのキャラクタセットは、v$nls_parametersを検索することで確認可能です。

$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 月 11月 25 18:41:37 2024
Version 19.14.0.0.0

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



Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.14.0.0.0
に接続されました。

SQL> select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';

PARAMETER           VALUE               CON_ID
------------------- ------------------- ------
NLS_CHARACTERSET    AL32UTF8                 1

PDBのキャラクタセット

PDBのキャラクタセットもCDBと同様に確認可能ですが、
対象のPDBに接続してあげる必要があります。

$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 月 11月 25 18:41:37 2024
Version 19.14.0.0.0

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



Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.14.0.0.0
に接続されました。

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO

SQL> alter session set container = PDB1;

セッションが変更されました。

SQL> select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';

PARAMETER           VALUE               CON_ID
------------------- ------------------- ------
NLS_CHARACTERSET    AL32UTF8                 3

SQL*Plusで文字化けが発生した場合

SQL*Plusからデータベース・インスタンスに接続した際に、??????といった文字化けが発生することがあります。

$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Nov 25 18:44:03 2024
Version 19.14.0.0.0

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



Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.14.0.0.0
?????????
SQL>

これはデータベースのキャラクタセットと、
クライアント側(SQL*Plus)で受け取るキャラクタセット(文字コード)が異なっている場合に発生します。

クライアント側で受け取るキャラクタセットをデータベース側と同じにすることで回避できます。
具体的にはNLS_LANG環境変数を設定します。

データベースのキャラクタセット(UTF8)とクライアント側のキャラクタセット(UTF8)を揃えた上で、
データベース・インスタンスに接続してみると、文字化けせずに正しく表示されます。

$ export NLS_LANG=Japanese_Japan.UTF8
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 月 11月 25 18:45:54 2024
Version 19.14.0.0.0

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



Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.14.0.0.0
に接続されました。
SQL>
りお
りお

文字化けを気にしたくない場合は、
NLS_LANG=American_America.UTF8 と設定するのが無難です。
英語出力になりますので文字化けは発生しません。

マルチテナント構成でのキャラクタセット

マルチテナント構成では、新規作成されたPDBのキャラクタセットは、
作成元となるCDBのキャラクタセットと同じになります。

一方で、マルチテナント構成では、PDBをCDB間で移動したり、コピーしたりすることができます。
この場合、複数のキャラクタセットを持つPDBが、CDB内で混在する可能性がありますが、
以下のようなルールが存在します。

  • CDBのキャラクタセットがUTF8の場合:UTF8を含む、他のキャラクタセットのPDBを格納可能です。
  • CDBのキャラクタセットがUTF8ではない場合:CDBと同じキャラクタセットのPDBのみを格納可能です。

キャラクタセットをCDBとPDBで混在させる可能性も低いですが、
このようなルールがありますので、ご注意ください。

まとめ

本ページでは、CDBおよびPDBのキャラクタセットを確認する方法をお伝えしました。
キャラクタセットの確認もそうですが、
文字化けが発生した場合についても参考にしていただければと思います。

プログラミングスクールをまとめました。
Pythonなどのプログラミングを学ぶことで実現できることの幅が広がりますので、
参考にしていただければと思います。

コメント

タイトルとURLをコピーしました