diadia

興味があることをやってみる。自分のメモを残しておきます。

PostgreSQLのエンコーディングについて

エンコーディングについてのドキュメント

djangoでpostgeSQLを使う時ALTER ROLE username SET client_encoding TO 'UTF8';とやってきた。これはデータベースのエンコーディングUTF-8に変えることだと思っていた。しかし違う可能性が発覚。
ベストアンサー参照すること
http://q.hatena.ne.jp/1348030529
ということでドキュメントを見てみる。
https://www.postgresql.jp/document/11/html/multibyte.html

データベースのエンコーディング設定

データベースのエンコーディングの設定場面は二か所あるようだ。一回目がデフォルトのエンコーディングを定めるもの。二回目が個別具体的に定める。デフォルトのエンコーディングはinitdbコマンドを入力してデータベースクラスタを初期化するときに定められる。これはデフォルト値になるのでデータベースを作成するときにデフォルト値を上書きすることができる。

initdb -E EUC_JP

上記のようにデフォルトの設定する。

データベースを作成時には以下のように行う

createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean
#または
CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;

postgresqlクライアント側の文字セット設定

クライアント側の文字設定は以下のように行う。いろいろな方法で設定できる。

\encoding SJIS

SET CLIENT_ENCODING TO 'value';

自動文字セット変換は、どうやらクライアント側で入力したSQLをデータベース側で適切なエンコードになおしてデータベースに反映させる仕組みらしい。サーバのエンコードに対して対応していないエンコード方法をクライアント側で設定するとエラーが出てくるようだ。おそらくこの機能を通じてクライアントとサーバのエンコード変換の質を担保する、ということではないだろうか。