1

開発環境に移行しようとしている Heroku Rails アプリケーションを継承しました。

Heroku は PG 9.1.9 を実行しており、Local は PG 9.2.4 を実行しています。Rails 3.2.11、pg gem '0.13.2'、ローカル OS Debian 7。

Heroku データベース情報:

$psql -l "dbname=abc... user=aaa etc"
  Name |  Owner | Encoding |   Collate   |    Ctype    |   Access 
 ---------------+----------+-------------+-------------+-------------+-----------------------
abcdef | abcdef | UTF8     | en_US.UTF-8 | en_US.UTF-8 | abcdef=CTc/abcdef

私の知る限り、本番PGデータベースはUTF8エンコーディングを使用しています。

Heroku からのエクスポート:

pg_dump -C "dbname=abc... user=aaa etc" > dump_plain.sql

pg_dump -Cオプションを使用して、ダンプ ファイルに基づいてデータベースが再作成されるようにし、ターゲット データベースを手動で作成する場合のエンコードの問題を回避しました。

Heroku データベース

$head dump_plain.sql
--
-- PostgreSQL database dump
--

SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;

次に、dump_plain.sql を編集してデータベース名と所有者を変更し、次の方法でインポートします。

psql < dump_plain.sql

エラーは報告されていません。

$psql -l
      Name       |  Owner   | Encoding |   Collate   |    Ctype    |   Access 
 ----------------+----------+----------+-------------+-------------+-----------------------
  imported_d     | only_me  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

PSQL は、両方のデータベースのエンコーディングが同じであり、Rail の database.yml、AFAIK が同じエンコーディングを使用する必要があることを報告しています。

Railsデータベース.yml:

development:
  adapter: postgresql
  database: stm_test
  encoding: utf8

新しくインポートしたデータベースから Rails3 Web アプリケーションを実行すると、何らかの理由で、省略記号 (...) などの拡張 ASCII 文字が二重にエンコードされます。

説明するスクリーンショット:

ローカル開発での二重エンコーディング ダブルエンコーディング

Heroku での正しいエンコーディング 本番環境で正しく表示

このデータは TEXT 列として保存されます。

CREATE TABLE templates (
    id integer NOT NULL,
    screen_writer text, <---- stored here
    action_list text
);

LOCALのpsql selectスニペット

label: "\"\xE2\x80\xA6I was proud of having\xE2\x80\xA6\"" 

Heroku での psql select スニペット (heroku pg:psql > select .... 経由)

label: "\"\xE2\x80\xA6I was proud of having\xE2\x80\xA6\"" 

JSON スニペットの表示:

production: "label":"\"\u2026I was proud of having\u2026\""
local: "label":"\"\u00e2\u0080\u00a6I was proud of having\u00e2\u0080\u00a6\""

追加の \u00 に注意してください。問題はサーバーの postgres クライアントのエンコード設定に関連していますか?

Local dev の LOCALE 設定は、Heroku のものと一致します。

$locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

簡単なステップが欠けていると感じており、誰かが私を正しい方向に向けることができれば、永遠に感謝します.

4

1 に答える 1

0

解決:

Rails.root/config/boot.rb に追加

require 'yaml'
YAML::ENGINE.yamler = 'syck' 
于 2013-08-06T18:26:48.457 に答える