PostgreSQLのinitdbでEncodingが指定通りにならない

下記の条件でPostgreSQLの構築をしたら初っ端からハマった。

– CentOS 6.5 (さくらVPS)

– PostgreSQL 9.3

PostgreSQLインストール後、データベースクラスタの初期化を行うためinitdbコマンド使用するが、この際に指定したはずの文字コードが設定されない。

データベースクラスタの初期化には、他所のサイトを参考に下記のコマンドを実行した。

service postgresql-9.3 initdb –no-locale -E UTF8

(wordpressではなぜかハイフン2つが続くと省略されるが、上記のno-localeの前のハイフンは2つ)

これにより、本来であればロケールの設定は無効、文字コードはUTF8に設定される。

…と思っていたがそうはならなかった。

下記のコマンドで、DBの一覧を表示してみると、実際にされている文字コード(Encoding)はSQL_ASCIIなるものになっていた。

[root]# su – postgres
[-bash-4.1]$ psql -l

(厄介なことにこの文字コードの設定はinitdb実行時にしか設定できず、これを変更したければ再度initdbを実行し直さなければならない。やり直し際の手順は後述。)

 

調べてみると同じ内容で困っている人がいた。

What is going wrong with postgresql initdb? Why is the `UTF-8` encoding not getting enforced?

結論としては上記のコマンドの実行の仕方だと、OSのrunlevelのスクリプトを通してinitdbが呼ばれる(謎)から引数が無視されるらしい。

そんで解決策としては以下のように、initdbを直接呼べばいいらしい。

initdb –encoding=UTF8 no-locale

このinitdb実行時に「コマンドが見つからない」旨のエラーが出たら下記を参照。

initdbが実行できない

 

■initdbのやり直し

以上を踏まえてinitdbを再度実行したいところだが、一度initdbを実行すると、二度目からは初期化済みであるとのエラーが出て実行できない。

initdbをやり直したい場合は一度/var/lib/pgsql/9.3/data配下を削除した上で、改めてinitdbを実行する必要がある。

rm /var/lib/pgsql/9.3/data -rf

 

以上。

————

ところでinitdb実行時のパラメータが無視されたとしてもなぜSQL_ASCIIになっちゃうのか、と思って

CentOSのロケールを調べてみたら

cat /etc/sysconfig/i18n
→LANG=”C”
となっていた。
initdb実行時に–no-localeが指定されていないと、ロケールの設定はOSの設定が引き継がれるらしいのでこれが原因のようである。
このLANG=Cってやつの詳細についてはとりあえず割愛。
LANG=”ja_JP.UTF8″に書き換えておいた。
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中