Symfoware Serverクライアントの環境変数(PGCLIENTENCODING)設定後のデータベースアクセスエラーについて
Symfoware Server (Open/Postgres共通)のよくあるご質問を検索できます。
Symfoware Serverの技術情報はこちら
- WindowsOSで動作するSymfoware Serverクライアントにおいて、環境変数(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と指定することで影響を局所化することができます。
製品・サービス区分 | Symfoware | ||||
---|---|---|---|---|---|
製品・サービス情報 |
|
||||
アンサー種別 | 運用/保守 |