Enterprise Postgresクライアンントの環境変数(PGCLIENTENCODING)設定後のデータベースアクセスエラーについて

Enterprise Postgres の技術情報はこちら

WindowsOSで動作するEnterprise Postgresクライアントにおいて、環境変数(PGCLIENTENCODING)に「SJIS」を設定した状態でNpgsqlを介した.NETアプリケーションからデータベースへアクセスすると、バイト[xx][yy] を指定されたコードページからUnicodeへ変換できません。のエラーが出力されました。原因と回避方法を教えてください。
[原因]
.NET FrameworkのString型データは内部的に「UTF16」で保持されています。そのため、サーバ側でclient_encodingに従い「SJIS」に変換されたデータが、クライアント側で再度SJISからUTF16へ変換された際に、.NET Framework内に対応する文字の変換規則が無かったことが原因です。

Npgsqlでは、文字列型のデータを.NET Frameworkのstring型として結果を返却するため、Encodingパラメータに設定されたエンコーディングに従って受け取ったバイト列を「UTF16」へ変換します。
ClientEncodingパラメータや環境変数(PGCLIENTENCODING)、Encodingパラメータに「SJIS」を設定した場合、データがサーバ側で「UTF8」から「SJIS」に変換された上でクライアントに送信され、Npgsqlが受信したデータを「SJIS」からUTF16へ変換しようとした際に、.NET Framework内に変換規則が定義されていない文字がエラーとなります。
なお、ClientEncodingパラメータや環境変数(PGCLIENTENCODING)、Encodingパラメータに「UTF8」が設定されている場合、Npgsqlがサーバから受け取ったバイト列を「UTF8」とみなし、「UTF8」から「UTF16」へのコード変換が行われますが、「UTF8」と「UTF16」はいずれもUnicodeの符号化方式であるため変換エラーは発生しません。
そのため、Npgsqlを利用される場合には基本的にClientEncodingおよび環境変数(PGCLIENTENCODING)の設定をデフォルト値である「UTF8」に設定していただくことを推奨します。

なお、サーバ側のpostgresql.confファイルでclient_encodingを指定されている場合、サーバに接続するすべてのアプリケーションのclient_encodingのデフォルト値に影響しますが、Npgsql使用のアプリケーションのみ接続文字列等でClientEncodingパラメータにUTF8と指定することで影響を局所化することができます。
製品・サービス情報
対象製品Enterprise Postgres
プラットフォームWindows,Solaris,Linux
アンサー種別 運用/保守
このページの先頭へ