h_nari @ 熊本市のブログ。電子工作、プログラミング、ゲーム、TV、 政治、インターネットなどに日々の思い付きを、 うだうだ~と書いていきたい。
このブログにはコメント欄を設けておりません。 記事への御意見、ご質問はtwitter @h_nari宛に お願い致します。


アーカイブ


アマゾン・ベストセラー

メタ情報
RSS
Login

postgresqlでトラブル

内製の業務管理システムでトラブルが発生。 調べると 業務ごとに1つづつしか無いはずのレコードが 複数ある。 Linuxのサーバを移行した際の データベース移動で間違えたのではないかと思われる。 一意制約をつけておくべきだったと反省する。

postgresqlを使ったシステムなので SQLでなんとかならないかと試行するが上手く行かない。 仕方がないのでperlでDBIを使い データを修正する簡単なプログラムを作成し、 希望のテーブルができた。

このテーブルをシステムに組み込めば完成だと思ったが エラーが発生。「Encode.pmで Wide文字列を decodeしようとした」というエラーメッセージをperlが吐く。 エンコーディングはutf8なので perlでutf8フラグが付いているとか付いていないとかの 話かと思い、いろいろ試すが解決しない。

前のテーブルに戻すとエラーは発生しない。 新しいテーブルのデータと比較するが 違いがない。試しに新しいテーブルのデータを 全て削除するがエラーがでる。 ここでデータの問題ではなくテーブルの属性の 問題だと考え、いろいろ調べるがわからない。

こうなったら古いテーブルをコピー、中身を 空にして、新しいデータを追加してやれば 属性は引き継がれるのではないかと考え、 postgresqlのテーブルのコピー方法を読むと テーブル作成後、所有者や権限も設定しろとある。

権限? ここで新しいテーブルに権限を付け忘れていた ことに気がつく。 GRANT文で権限をつけたところ システムは動くようになった。

GRANTつけ忘れで随分長いことハマってしまった。 Encode.pmのエラーの原因がGRANTだとは ちょっと思いつかない。

perlの encode/decodeはわかりにくい。 utf8フラグが何なのか未だ理解していない。 最近の言語だと binary stringとstringを 区別することでわかりやすくなっている。 perlも早くそうなってほしい。