我继承了一个 Heroku Rails 应用程序,我正在尝试将其迁移到我的开发环境中。
Heroku 正在运行 PG 9.1.9,Local 正在运行 PG 9.2.4。Rails 3.2.11,pg gem '0.13.2',本地操作系统 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
AFAIK,生产 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 webapp 时,扩展 ASCII 字符(例如省略号 (...))会被双重编码。
截图说明:
本地开发的双重编码
Heroku 上的正确编码
此数据存储为 TEXT 列:
CREATE TABLE templates (
id integer NOT NULL,
screen_writer text, <---- stored here
action_list text
);
psql 在 LOCAL 上选择片段
label: "\"\xE2\x80\xA6I was proud of having\xE2\x80\xA6\""
Heroku 上的 psql 选择片段(通过 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=
我觉得我错过了一个简单的步骤,如果有人能把我推向正确的方向,我将永远感激不尽。