日本語のようなマルチバイト文字を扱う場合には、
データベースを作成する時に正しいキャラクタセット(文字コード)を指定する必要があります。
本ページは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で混在させる可能性も低いですが、
このようなルールがありますので、ご注意ください。
\ 最短1ヶ月で未経験からプロを育てる! /
まとめ
本ページでは、CDBおよびPDBのキャラクタセットを確認する方法をお伝えしました。
キャラクタセットの確認もそうですが、
文字化けが発生した場合についても参考にしていただければと思います。
プログラミングスクールをまとめました。
Pythonなどのプログラミングを学ぶことで実現できることの幅が広がりますので、
参考にしていただければと思います。
コメント