0

postgresql データベースのエントリを更新すると問題が発生します。文字が間違った形式に変換されます。私が更新する方法は次のとおりです。

use Encode;
...
$user_name = escapeSql($user_name); # a statement that to doese this: line 1: $s =~ s/\?/_/g; and line 2: $s =~ s/\*/%/g;
$user_name = decode("utf-8", $user_name);
...
$statement = "UPDATE person SET name='".$user_name."', email='".$user_email."' WHERE id='".$user_id."'"; # The real statement have some more attributes, buts its the name that errors.
print STDERR "Statement: ". $statement;
$sth = $dbh->prepare($statement);
$result = $sth->execute();

ご覧のとおり、ステートメントを出力して、user_name が正しいかどうかを確認します。次のようになります。 ここに画像の説明を入力

ご覧のとおり、「Thør Åstrüp Pédersen」と書かれていますが、これは私の名前で、エントリを挿入/更新しようとしている文字を特別な文字に置き換えています。数日前からデバッグしている大きな問題は、データベースで select ステートメントを作成し、user_name をフェッチして、新しい名前 (Dojo を使用して Web GUI に入力) が変更および更新されたかどうかを確認することです。 .しかし、それは次のようになります:

ここに画像の説明を入力

データベースがそれを処理する理由や、データベースがどの文字エンコーディングに設定されているかを確認して正しい変換を行う方法を理解できません。しかし、ここでも、エラーログが正しく出力するため (最初の画像で示したように) PERL では良さそうに見えますが、PostgreSQL データベースはそれを嫌い、何らかの理由でそれを安っぽい文字に変換します。

エンコーディングの問題に遭遇したのは初めてではありませんが、誰かが助けてくれることを本当に願っています..しかし、PerlやPHPの問題ではなく、PostgreSQLの問題のように見えるため、初めて理解できませんでした。

4

1 に答える 1

2

psql プロンプトで \l を発行すると、データベースのエンコードを確認できます。「show client_encoding;」を使用してクライアントのエンコーディングを確認することもできます。

UTF8 でデータベースを再作成する方が良いかもしれません。PostgreSQL のエンコーディングに関するすべてはマニュアルで説明されています。

于 2012-06-13T12:44:14.657 に答える