- PR -

PostgreSQLの文字コード変換(Moodle)

1
投稿者投稿内容
しるしる
常連さん
会議室デビュー日: 2005/10/25
投稿数: 24
投稿日時: 2006-10-05 12:37
PostgreSQLの操作についてご質問がございます。
この会議室が適切かどうか分かりませんが、もしより適切な場所がございましたら、
ご案内を頂けますと幸いです。

- 当方の環境は以下の通りです。
OS: Solaris9 for SPARC
Moodle 1.4.2
PostgreSQL 7.4.13

- やりたい事は以下の通りです。
Moodle(eラーニングシステム)をPostgreSQLにて運用しております。現在はPostgreSQLのENCODINGをSQL_ASCIIにしておりますが、これをUNICODEに変換した別のデータベースを
作成しようとしてはまっております。尚、現在のMoodle用データベースはmoodle、
新規に作成するUTF8でのMoodle用データベースはmoodleutf8です。また、それらの
ユーザ(OWNER)はmoodleuserです。

- 作業内容は以下の通りです。

o データベースのバックアップ
以下のコマンドにより /tmp/moodle.dump が作成されるのでこれをバック
アップしておく。

su - postgres
pg_dump -Fp moodle > /tmp/moodle.dump

o 新しいデータベースの作成
postgres ユーザになって以下のコマンドを実行する。
これにより、新しいデータベースが UTF8 の文字コードで作成された。

su - postgres
createdb -T template0 -E UNICODE -O moodleuser moodleutf8

o 漢字コードの変換
以下のようにしてダンプデータの漢字コードを UTF8 に変換する。

Windows 環境にファイルを転送して、TeraPad で漢字コード以下の
ようにを指定して保存する。
漢字コード: UTF8N
改行コード: LF

o ダンプファイルの修正
ダンプファイルの先頭にある

SET client_encoding = 'SQL_ASCII';



SET client_encoding = 'UNICODE';

に修正する。

o データベースのリストア
漢字変換後のダンプデータを新しいデータベースにリストアする。

su - postgres
psql -d moodleutf8 < moodleUTF8.dump

この時問題が発生しました。

- 問題の内容
以下のERRORメッセージが出力されました。

ERROR: missing data for column "timemodified"
CONTEXT: COPY mdl_user, line 15: "534726 27 manual 1 1 username@hostname.com.1101945178 XXXXXXXXXXXXXXXXXXXXXXXX \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

mdl_userはMoodleに登録されているユーザ情報が格納されているテーブルで、
上記メッセージによりそれ以下の全てのユーザ(上記テーブルが最初なので全て
のユーザ)の情報が見えなくなりました。

ダンプファイル中の上記テーブルの該当部分は以下の通りです。
(元のダンプファイルから抜粋して一部個人情報部分は伏せてあります。)

COPY mdl_user (id, auth, confirmed, deleted, username, "password", idnumber, fir
stname, lastname, email, emailstop, icq, phone1, phone2, institution, department
, address, city, country, lang, timezone, firstaccess, lastaccess, lastlogin, cu
rrentlogin, lastip, secret, picture, url, description, mailformat, maildigest, m
aildisplay, htmleditor, autosubscribe, timemodified) FROM stdin;
13 manual 1 1 username@hostname.com.1101871409 XXXXXXXXXXXXXXXXXXXXXXXX \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N てすと ユーザ 0 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N ハ。イャクゥ JP ja 99 0
0 0 0 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\N 1 0
2 1 1 1101871409

timemodifiedに対応するテーブルが無いとのエラーですが、数を数えたところ問題
無いように思えますし、そもそも単に漢字コードの変換を行ったのみですので、一体
何が問題なのか分からない状態です。ちなみに、上記のような問題があるため、元の
データベースを使用するとユーザ情報が正しく見れるのに、UNICODEに変換したもの
の場合、全く見れなくなります。

以上、初歩的なご質問になると思いますが、どうぞよろしくお願いいたします。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2006-10-05 15:37
直にpg_dumpを扱った事が無いから、pg_dumpを使った場合にはどう書けばいいのか分からないのですが・・・

COPY形式でdumpした場合は、改行コードが変わったりなんなりで変な事になる場合があるので、SQL形式でdumpした方が安全だと思います。
(phpPgAdminを使ってるんだけど、今まで使っていた感じから。)

後、引用されているデータの一部
引用:

ハ。イャクゥ JP ja 99 0


化けてないですか?
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-10-05 18:18
ASCIIコードだけの場合UTF8にしてもバイト数が同じですが

UTF8の場合、日本語1文字の保存に必要とするバイト数が
現在使用している文字コードより多くなります

データに日本語があるのでUTF8にしてバイト数が増え
カラムの桁より多いバイト数のためエラーになった可能性があります


[ メッセージ編集済み 編集者: 99ri 編集日時 2006-10-05 18:35 ]
しるしる
常連さん
会議室デビュー日: 2005/10/25
投稿数: 24
投稿日時: 2006-10-11 14:08
お世話になっております。
ご返答が遅くなりまして申し訳ございません。

冬寂様>
SQL形式というのは、DUMPしたデータがSQL文になっている形式でしょうか。
もしそうであれば、恐らくSQL形式でDUMPしていると思われます。
pg_dumpではオプションに-Fpを指定する事により、SQL形式でダンプ出来ると
考えております。もし誤りがあればご教示いただければ幸いです。
また、文字化けしている箇所は、変換前にDUMPしたデータ中でも文字化けして
おりました・・・。

99ri様>
バイト数の増大によってエラーになった可能性があるという事ですか。
MySQLの場合、EUCからUTF-8に変換するためには、varchar型の大きさを
変更する必要がありましたが、それと同じような処理を行う必要がある
という事でしょうか。

もしそうであれば、具体的にどの程度の大きさに増やせばよいかについて、
もしお分かりであればご教示頂けますと幸いです。
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-10-11 23:42
引用:

99ri様>
バイト数の増大によってエラーになった可能性があるという事ですか。
MySQLの場合、EUCからUTF-8に変換するためには、varchar型の大きさを
変更する必要がありましたが、それと同じような処理を行う必要がある
という事でしょうか。



PostgreSQL 7.4.6 の日本語訳マニュアルをみるとバイト長でなく、文字長となっていました
バイト長でないのでエラーとは関係ない可能性があります

マニュアルより抜粋 「データ型は2つともn文字長までの文字列....」

対応はMYSQLの場合と同様です。通常漢字1文字3バイト、一部4バイトになります


[ メッセージ編集済み 編集者: 99ri 編集日時 2006-10-12 00:00 ]
しるしる
常連さん
会議室デビュー日: 2005/10/25
投稿数: 24
投稿日時: 2006-11-01 17:17
ご返答が遅くなりまして申し訳ございません。

解決いたしましたのでご報告いたします。

結果として、エラー
ERROR: missing data for column "timemodified"
CONTEXT: COPY mdl_user, line 15: "534726 27 manual 1 1 username@hostname.com.1101945178 XXXXXXXXXXXXXXXXXXXXXXXX \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
が発生している行(mdl_userの15行目)に異常があったようで、該当行を
削除する事で正しくrestore出来ました。
冬寂様からご指摘を頂きましたように、文字化け等によりエントリの数が
整合性が取れなくなったのかもしれません・・・。

この度は皆様どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)