実行中の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)
_
さて、まず最初に:ユーザーまたはデータベースのエンコードを設定しても効果がないのはなぜですか?
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
_)は無視されます。
client_encoding
でpostgresql.conf
を設定しました(構成を再読み込みまたは再起動しました)か? utf8ではなくUTF8であることを確認してください
cat ~/.psqlrc
およびcat /etc/psqlrc
の結果は何ですか?
サーバー側のデフォルトを探していることは知っていますが、クライアントではOS envvarを設定できます:
export PGCLIENTENCODING=UTF8
(そのマシン上の)すべてのユーザーに対してこれを行うには、/etc/profile
に入れます