[pgsql-jp: 26829] Re: UNICODEカナソート

Tatsuo Ishii t-ishii @ sra.co.jp
2002年 7月 25日 (木) 22:29:07 JST


石井です.

> Redhat7.2のRPMのPostgresql7.1.3を使うと文字コードがUNICODEの場合、カ
> ナのソートができないようです。これを解決するため、--enable-localeを取っ
> てPostgresqlを再コンパイルしたらカナのソートができるようになりました。但
> しデータベースの再構築(initdb)が要求されました。

それはまあ,そうでしょう.Red HatのPostgreSQLのRPMは日本語環境でテスト
しているとはとても思えません.一度でもテストしていればこういう不具合に
気が付き,--enable-localeを外すはずですが...

# その点Vine LinuxのRPMは素晴らしい.

> 問題1、RPMのまま(つまり--enable-localeをつけてコンパイルした状態)で
> Unicodeのカナソートができるようにする方法がありますか。

Red HatのRPMを使う限り無理でしょう.やったことはありませんが,Vine
LinuxのSRPMをRed Hatでbuildして入れてみるとか?

> 問題2、問題1の答えがNOの場合、--enable-localeを取って再コンパイルする
> のは良いのですが、データバースの再構築はしたくありません。何か方法があり
> ますか。

これも簡単な方法はありません.以下紹介する方法は検証もしてませんし,結
果についても一切保証できませんが,それでもよければお試し下さい.なお,
試すときはpostmasterを停止し,データベースクラスタをtarなどを使って物
理的にバックアップを取っておくことを強くお勧めします.

(1) データベースクラスタのディレクトリの下に,global/pg_controlという
    ファイルがあります.この中にロケールに関するデータが格納されている
    ので,それを"C"ロケールに書き換えれば理論的には良いはずです.ただ
    し,このファイルはバイナリファイルなので,普通の方法では書き換えで
    きません.emacsのバイナリ編集モードなどを使うか,適当なプログラム
    を書く必要があります.contrib/pg_controldataが参考になります.

(2) contrib/pg_resetxlogを使う.global/pg_controlをcp /dev/nullするな
    どして破壊し,--enable-localeなしで作ったpg_resetxlogを使うと
    pg_controlが"C"ロケールで初期化されます.

いずれの方法も非常に危険なので,少しでも不安のある方には絶対にお勧めで
きません.失敗すると簡単にpostmasterが立ち上がらなくなります.また,こ
の方法でうまくpostmasterが立ち上がっても,ASCII以外のデータが含まれた
Btreeインデックスはまともではない状態になっている可能性があります.必
要ならばREINDEXなどを使ってインデックスを再構築してください.
# ここまで脅したら,試す人など皆無だろうな:-)
--
Tatsuo Ishii



pgsql-jp メーリングリストの案内