web-dev-qa-db-ja.com

Postgresでデフォルトのclient_encodingを変更するにはどうすればよいですか?

実行中のPostgreSQLデータベースの_client_encoding_構成変数のデフォルト値を変更しようとしています。 _UTF8_にしたいのですが、現在は_LATIN1_に設定されています。

データベースはすでにUTF8エンコードを使用するように設定されています。

_application_database=# \l
                                                 List of databases
           Name       |  Owner   | Encoding |   Collate   |    Ctype    |          Access privileges
----------------------+----------+----------+-------------+-------------+--------------------------------------
 postgres             | postgres | LATIN1   | en_US       | en_US       |
 application_database | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres           +
                      |          |          |             |             | application_database=Tc/postgres
 template0            | postgres | LATIN1   | en_US       | en_US       | =c/postgres                     +
                      |          |          |             |             | postgres=CTc/postgres
 template1            | postgres | LATIN1   | en_US       | en_US       | =c/postgres                     +
                      |          |          |             |             | postgres=CTc/postgres
(4 rows)
_

どの ドキュメントによると は、alreadyになり、クライアントはデフォルトの_client_encoding_(エンファシスマイニング)としてUTF8を使用します。

client_encoding (string)

クライアント側のエンコード(文字セット)を設定します。 デフォルトでは、データベースエンコーディングを使用します。

しかし、そうではありません:

_$ Sudo psql --dbname=application_database
psql (9.1.19)
Type "help" for help.

application_database=# SHOW client_encoding;
 client_encoding
-----------------
 LATIN1
(1 row)
_

_ALTER USER <user> SET ..._を使用して、ログインしているユーザーのデフォルト設定を変更することも試みました。

_application_database=# ALTER USER root SET client_encoding='UTF8';
ALTER ROLE
application_database=# SELECT usename, useconfig FROM pg_shadow;
         usename      |       useconfig
----------------------+------------------------
 postgres             |
 root                 | {client_encoding=UTF8}
 application_database |
(3 rows)
_

しかし、それも効果がありませんでした:

_$ Sudo psql --dbname=application_database
psql (9.1.19)
Type "help" for help.

application_database=# SELECT current_user;
 current_user
--------------
 root
(1 row)

application_database=# SHOW client_encoding;
 client_encoding
-----------------
 LATIN1
(1 row)
_

私のシステムのPSQLファイルには何もありません:

_vagrant@app-database:~$ cat ~/.psqlrc
cat: /home/vagrant/.psqlrc: No such file or directory
vagrant@app-database:~$ cat /etc/psqlrc
cat: /etc/psqlrc: No such file or directory
vagrant@app-database:~$ Sudo su
root@app-database:/home/vagrant# cat ~/.psqlrc
cat: /root/.psqlrc: No such file or directory
_

PosgreSQL 9.1を実行しています:

_application_database=# SELECT version();
                                                   version
-------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.1.19 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
(1 row)
_
7
Ajedi32

さて、まず最初に:ユーザーまたはデータベースのエンコードを設定しても効果がないのはなぜですか?

psql documentation からのこの行のためであることがわかります。

標準入力または標準出力の少なくとも1つが端末の場合、psqlはクライアントエンコーディングを「auto」に設定します。これにより、ロケール設定(UnixシステムのLC_CTYPE環境変数)から適切なクライアントエンコーディングが検出されます。これが期待どおりに機能しない場合、環境変数PGCLIENTENCODINGを使用してクライアントのエンコードをオーバーライドできます。

したがって、実際には、以前の構成の変更は実際にはhave動作しており、インタラクティブなpsqlコンソールでは動作していません。次のコマンドを試してください。

_Sudo psql --dbname=application_database -c "SHOW client_encoding;" | cat
_

クライアントのエンコードは実際にはUTF8であることがわかります。

_ client_encoding
-----------------
 UTF8
(1 row)
_

ここでコマンドを再度実行しますが、catにパイプせずに:

_Sudo psql --dbname=application_database -c "SHOW client_encoding;"
_

結果が得られるはずです。

_ client_encoding
-----------------
 LATIN1
(1 row)
_

そのため、基本的に、psqlは端末に関連するコマンドに対して_LATIN1_エンコーディングのみを使用しています。

どうすれば修正できますか?まあ、いくつかの可能な方法があります。

1つは、ドキュメントの提案どおりに実行し、PGCLIENTENCODING環境変数を_UTF8_に永続的に設定します(_~/.profile_または_~/.bashrc_など、ユーザーのみに影響を与える、または_/etc/environment_システム全体に影響を与える( 環境変数を永続的に設定する方法 を参照)。

別のオプションは、_en_US.utf8_(または同等のもの)の代わりに_en_US_を使用するようにシステムロケール設定を構成することです。これを行う方法はシステムによって異なる場合がありますが、通常は_~/.config/locale.conf_(ユーザーのみ)または_/etc/default/locale_または_/etc/locale.conf_(システム全体)を変更することで実行できます。これは単なるpostgres以上のものに影響し、問題の根源により密接に対応していると思います。 locale を実行すると、現在のロケール設定を確認できます。

他の解決策の1つは、psqlrcファイルを更新して_SET client_encoding=UTF8;_を含めることです。そのファイルは_~/.psqlrc_(ユーザーのみ)または_/etc/psqlrc_(システム全体)にあります。 docs state (emphasis mine):

_--command=command_

Psqlが1つのコマンド文字列commandを実行してから終了することを指定します。これはシェルスクリプトで役立ちます。 このオプションでは、起動ファイル(psqlrcおよび_~/.psqlrc_)は無視されます。

14
Ajedi32

client_encodingpostgresql.confを設定しました(構成を再読み込みまたは再起動しました)か? utf8ではなくUTF8であることを確認してください

cat ~/.psqlrcおよびcat /etc/psqlrcの結果は何ですか?

サーバー側のデフォルトを探していることは知っていますが、クライアントではOS envvarを設定できます:

export PGCLIENTENCODING=UTF8

(そのマシン上の)すべてのユーザーに対してこれを行うには、/etc/profileに入れます

2
Neil McGuigan