【豆知識】文字セットの変換がサポートされていないというエラーを解決したい
PostgreSQLインサイド

実現方法

PostgreSQLのデータベースサーバーを起動した後や、クライアントからデータベースサーバー上のデータベースへの接続時に、データベース側とクライアント側の文字セット(エンコーディング)の組み合わせによっては、エラーメッセージ「変換はサポートされていません」が出力されることがあります。PostgreSQLにはデータベースサーバーとクライアント間で自動的に文字セットを変換する機構(自動文字セット変換)がありますが、データベース側に指定した文字セットと、クライアント側に指定した文字セットが、サポートされていない組み合わせになっていることが原因です。
このような場合、実際に扱うデータの文字セットに合わせて、正しい組み合わせに設定する必要があります。

実行例

クライアント側の文字セットを正しく設定します。なお、ここではクライアントのエンコーディングはSJISであることを前提とします。

  1. データベースクラスタ内のデータベースの文字セット(エンコーディング)を確認
postgres=# ¥l

【出力例】
データベースクラスタ内には、エンコーディングがEUC_JPのデータベースが存在していることがわかります。

                                         データベース一覧
       名前        | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) |  アクセス権限
-------------------+--------+------------------+----------+-------------------+-------------------
 mydb              | fsepta | EUC_JP           | C        | C                 |
 postgres          | fsepta | EUC_JP           | C        | C                 |
 template0         | fsepta | EUC_JP           | C        | C                 |=c/fsepta        +
                   |        |                  |          |                   |fsepta=CTc/fsepta
 template1         | fsepta | EUC_JP           | C        | C                 |=c/fsepta        +
                   |        |                  |          |                   |fsepta=CTc/fsepta
(4 行)
  1. データベースの設定ファイルpostgresql.confファイルを参照してclient_encodingパラメーターの値を確認

    PostgreSQL文書の「23.3 文字セットサポート」を参照して、上記の¥lコマンドで確認したデータベースのエンコーディングとの組み合わせが自動文字セット変換でサポートされているかを確認します。この例では、データベース側:EUC_JPに対して、クライアント側:shift_jis_2004はサポートされていません。

client_encoding = shift_jis_2004
  1. client_encodingパラメーターの値を、実際のクライアントのエンコーディング(SJIS)に書き換え
    • 備考
      EUC_JPと組み合わせ可能な日本語の文字セットは、本ページ内の「ポイント」に掲載している組み合わせ表を参照してください。
client_encoding = sjis
  1. 設定ファイルを再読み込みして、変更を反映
pg_ctl reload
  1. client_encodingパラメーターに誤りがなかった場合、クライアント側のPGCLIENTENCODING環境変数に設定されている文字セットに誤りがある可能性があります。OSのコマンドを使用してPGCLIENTENCODING環境変数の設定値を確認し、自動文字セット変換でサポートされている文字セットに変更してください。

ポイント

  • PostgreSQLでは、initdbコマンドによるデータベースクラスタ初期化の際に、データベースのデフォルトの文字セットを指定できます。さらに、データベース作成時にデフォルトとは異なる文字セットを指定することで、同じデータベースクラスタ内で異なる文字セットのデータベースを使用することができます。このデータベース側の文字セットに対して、クライアント側に設定された文字セットが異なる場合、PostgreSQLはサポートする組み合わせの範囲で、自動的に文字セットを変換します。サポート外の組み合わせが指定された場合は、以下のようなエラーが出力されます。

    エラーメッセージの例

    initdbコマンドの-Eまたは--encodingオプションにEUC_JPを指定して初期化します。生成されたpostgresql.confファイルでclient_encodingにSHIFT_JIS_2004を設定し、pg_ctlコマンドでデータベースサーバーを起動すると、SHIFT_JIS_2004とEUC_JPの組み合わせがサポートされていないため、以下のメッセージが出力されます。

FATAL:  SHIFT_JIS_2004とEUC_JP間の変換はサポートされていません
  • データベースサーバーとの接続時にクライアント側のデフォルトの文字セットを設定するためには、以下の方法があります。
    • postgresql.confファイルのclient_encodingパラメーターを設定
    • 個々のクライアントにおいてPGCLIENTENCODING環境変数を設定
  • 日本語の文字セットにおいて、自動文字セット変換がサポートする組み合わせを、以下に示します。
    【凡例】レ:サポート、N/A:未サポート
    データベース クライアント
    EUC_JP EUC_JIS_2004 SJIS SHIFT_JIS_2004 UTF-8
    EUC_JP N/A N/A
    EUC_JIS_2004 N/A N/A
    UTF-8
    • 備考
      SJISとSHIFT_JIS_2004はデータベース側では使用できません。
  • データベース側とクライアント側の間で自動文字セット変換が実行されると性能上のロスが発生するため、可能であれば同一の文字セットを使用することをお勧めします。
  • 自動文字セット変換は、PostgreSQLのpg_conversionシステムカタログに予め格納された変換情報の範囲で実施されます。
  • 実際に扱うデータの文字セットが自動文字セット変換でサポートされていない組み合わせの場合は、SQL文のCREATE CONVERSIONコマンドを利用して新規の自動文字セット変換を追加するか、または、予めデータの文字セット自体を変換しておく必要があります。

参考

PostgreSQL 13.1文書

2021年7月30日公開

富士通のソフトウェア公式チャンネル(YouTube)

本コンテンツに関するお問い合わせ

お電話でのお問い合わせ

Webでのお問い合わせ

当社はセキュリティ保護の観点からSSL技術を使用しております。

ページの先頭へ