PostgreSQLを8.2.3へアップグレードしてハマる。

 これまで当ページはPostgreSQL 8.1.4というバージョンで運用しておりましたが、思いつきでアップグレードしてみました。その際、locale関係でハマってしまったのでメモ。

 そもそもこのサーバはVineLinux3.2で運用してまして、何も指定せずに普通にインストールしますればPostgreSQLのLocale設定はja_JP.eucjpとなります。で、Djangoは基本UTF-8ですから、データベースの文字セットをUTF-8にして使っていました。日本語を含む文字列のソート等で問題がなくもありませんでしたが、大きな問題ではないのでそのまま使っていました。
 が、今朝アップデートしてみると、エラー連発です。トップ等は普通に表示されるのですが、タグ別のページを表示しようとするとエラーが発生して表示されません。Djangoさんが送ってくる通知メールをみますれば、

ProgrammingError: ERROR: invalid multibyte character for locale
HINT: The server's LC_CTYPE locale is probably incompatible with the database encoding.

 とあります。もしかしたら8.1系とは扱いが変わってしまったのかも知れません。
 て訳で、面倒だし、これからも絶対にUTF-8以外のエンコードで使う事がない自信があったので、統一する事にしました。と言うか、「さっさとやってろ」です、はい。

 今回のエラーメッセージに含まれております、LC-CTYPEとLC_COLLATEはinitdb(←データベースをフォーマットして使える様にする感じ)時にしか指定できないので(←参照:多言語対応)、そこからやりなおしてリカバリします。
 「locale -a」で調べてみましたら、「ja_JP.utf8」と表現する様でしたので、

initdb --locale=ja_JP.utf8 -E UTF-8

 として実行。予め取っておいたバックアップをリカバリして事無きを得ました。

 副産物として(←や、副産物ではないから)、タグのリストでちゃんとソートされる様になったりもしましたので、まぁ、良かったんじゃないかな。