- 締切済み
postgreSQL EUC-JPで運用 copy
色々試してみましたがうまく行かず質問します。今までpostgreSQL9.6で標準のUTF8で使用していましたが今回postgreSQL12にして、データベースをEUC-JPで作成しました。postgresql.confの中のclient_encodeをSJISの定義もしました。 利用環境はtomcatでアプリを実行しており、その機能のひとつにpostgreSQLのファンクションを実行し、データをcsv出力しています(copy to)しかし、保存されたcsvはUTF8で出力されてしまいます。PSQLで直接copy toを実行するとSJISで出力されます。該当のファンクションで、copy toでencodingをsjis指定すると、tomcat経由でもsjisで出力されるのは確認しました。どこの設定でtomcatからのcopy toがデフォルトがUTF8になっているのでしょうか?データベースとの接続はJDBC接続でデータソースを使用しています。 どなたか教えていただけないでしょうか。宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- wormhole
- ベストアンサー率28% (1626/5665)
>今回はtomcatからファンクション実行でutf8形式で出力されたことから実行元のクライアントがutf8と認識されている?postgresql.confでclient_encodeをsjis指定していれば全てクライアントとのやり取りはsjisで行われるのでは?という浅い知識しかありません。 #1はcopy toをよく調べずに回答したのですが、 「copy to で出力されるファイルの文字コードをSJISで行いたい。」 という事であってますか? https://www.postgresql.jp/document/12/html/multibyte.html postgresql.confのclient_encodingは、サーバとクライアントの接続が確率した時点で自動的に設定される符号化方式ですが、その後変更ができると書かれています。 https://www.postgresql.jp/document/12/html/sql-copy.html copy to で出力されるファイルは、ENCODINGオプションまたはその時点のクライアント符号化方式で符号化される。と書かれています。 ということは、 postgresqlサーバとクライアントの接続直後は符号化方式sjisで、その後utf-8に変更(クライアント側で符号化方式の指定がされてたりしませんか?)され、その結果copy toで出力されるファイルの符号化方式がutf-8になっていると思われます。 なので対策としては ・postgresqlサーバとクライアント間の符号化方式をsjisで確実に固定しておく。 ・copy to 時に、encodingオプションで明示的にsjisを指定しておく。 のどちらかになると思います。 >postgresql.confでclient_encodeをsjis指定していれば全てクライアントとのやり取りはsjisで行われるのでは?という浅い知識しかありません。 postgresqlはドキュメントしっかりと書かれていますから、 ドキュメントをしっかり読むことをお勧めします。
- wormhole
- ベストアンサー率28% (1626/5665)
>保存されたcsvはUTF8で出力されてしまいます。 その「保存されたcsv」を、保存したのは何が保存したのでしょうか。 「tomcatでアプリを実行しており」と書かれている事からtomcat上で動作しているservlet等だと思うのですけど。 postgresqlにとってのクライアント(tomcat上で動作しているservlet等)と あなたが作成しているシステムとしてのクライアントを混同していたりしませんか?
補足
ご回答ありがとうございます。 javaの知識が詳しくなく、質問がうまくできていないかと思います。私の認識ではユーザーはブラウザを介してtomcat(javaプログラム)を操作し、tomcatがpostgreSQLにリクエストしたり、リターンをもらっていると認識しています。今回はtomcatからpostgreSQLに対し、このファンクションを実行してくださいとリクエスト→ファンクションにはあるテーブルをcsv形式でこの場所に出力というcopy文が記述してある、なので保存をしているのはpostgreSQLだと思っています。そのクライアントのエンコードをデフォルトとして扱って自動変換して出力する。なのでデータベースがutf8であってもpaqlのようにwindowsから実行するとsjis形式でcsvは出力される。という認識です。今回はtomcatからファンクション実行でutf8形式で出力されたことから実行元のクライアントがutf8と認識されている?postgresql.confでclient_encodeをsjis指定していれば全てクライアントとのやり取りはsjisで行われるのでは?という浅い知識しかありません。
補足
ありがとうございます。 その通りで出力したcsvの文字コードをsjisにしたいのが目的です。 質問にも記載した通り、copy文のオプションでencodingをsjis指定して出力は確認済みです。なので、すべてのファンクションを追記していけば問題は解決なのですが、根本的にはもうひとつの確実にクライアントとのやり取りはsjisで固定することを目指しています。ご指摘の箇所で接続時にはsjis方式になっているはずなのに実行時にutf8に指定されて実行されている箇所が残っている?ということになりそうなので再度調べてみます。ありがとうございます