0

呼び出し時

http://localhost:3000/tempbizs

tempbiz_controller の index メソッドを使用して、レガシー データベース (sqlite3) から Rails アプリ内の別の postgresql にデータを移行しています。

いくつかのレコードが挿入されました。ただし、ブラウザに表示される次のエラーがスローされたことがわかります。

ActiveRecord::StatementInvalid in TempbizsController#index

PG::Error: ERROR:  invalid byte sequence for encoding "UTF8": 0xca5a
: INSERT INTO "tempbizs" ("BusinessName", "BusinessSubType", "BusinessTradeName", 
"BusinessType", "City", "Country", "House", "Latitude", "LocalArea", "Longitude",     
"ZIP", "State", "Street", "Unit", "UnitType", "created_at", "updated_at") 
VALUES     ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) 
RETURNING "id"

挿入しようとしているデータは次のとおりです: RonZalkoTotal Body Fitness & Yoga

4

2 に答える 2

1

UTF-8 とは異なるエンコーディングのテキストがあり、それを UTF-8 データベースに挿入しようとしています。SQLite はテキスト エンコーディングに対して特別なことを何もしないので、データは SQLite では問題ありませんが、PostgreSQL では有効ではありません。データを移行するには、実際には UTF-8 ではないレコードを見つけて手動で変換する必要があります。

根本的な問題は、アプリケーションがエンコーディングを適切に処理していないことです。ユーザーは UTF-8 とは異なるエンコーディングでデータを送信でき、それがデータベースに到達しました。ページを調べて、ページが UTF-8 でレンダリングされていること、およびブラウザーがフォーム送信にそのエンコードを使用していることを確認する必要があります。モデルも確認する必要があるかもしれません。このテーブルがアクセスされるすべての場所を調べます。コードを掘り下げてすべてを再確認する以外に、SOで魔法の解決策を見つけることはできないと思います。

于 2012-05-03T17:27:56.417 に答える
0

varchar 列の 1 つが UTF-8 でエンコードされていることを PostgreSQL に伝えました。ただし、入力しようとしているデータ (0xCA5A) は有効な UTF-8 ではありません。

したがって、その値が実際にどのエンコーディングに含まれているかを把握し、挿入する前に変換する必要があります (または、そのエンコーディングを使用するように PostgreSQL に指示します)。

0xCA5A がテキストであってはならない場合は、PostgreSQL でテキストではなくバイナリ タイプを使用する必要があります。

SQLite ではデータの有効性を強制することはあまり行われないため、SQLite ではこれに遭遇しませんでした。

0xCA5A は、一般的なエンコーディングでは正しく表示されないため、単に破損している可能性もあります。

  • ISO-8859-1、-15、および cp1252: ÊZ
  • UTF16 (ビッグエンディアン): 쩚</li>
  • UTF16 (リトルエンディアン): 嫊</li>
  • shiftjis: ハZ

単に破損している場合は、無効なレコードを除外する必要があります。

于 2012-05-03T17:33:24.603 に答える