【问题标题】:Heroku PG Dump Export and PSQL Import -> Double Encoding of Extended ASCII CharactersHeroku PG Dump 导出和 PSQL 导入 -> 扩展 ASCII 字符的双重编码
【发布时间】:2013-08-07 08:33:51
【问题描述】:

我继承了一个 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 在本地选择 sn-p

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

psql 在 Heroku 上选择 sn-p(通过 heroku pg:psql > select ....)

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

查看一个json sn-p:

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=

我觉得我错过了一个简单的步骤,如果有人能将我推向正确的方向,我将永远感激不尽。

【问题讨论】:

  • 您确定网页不同吗?我想知道您的网络服务器(我想您有两个:一个远程和一个本地)是否在 http 响应上放置了正确的字符集?如果你保存两个页面,它们在磁盘上是否不同?
  • 嗨@eppesuig。感谢您的建议。 Chrome 的网络选项卡建议两个 Web 服务器都将编码设置为 utf-8(内容类型:application/json;charset=utf-8)。恢复后,我已使用来自生产和本地服务器的 json 示例更新了答案。
  • 不过,在 dbms 方面似乎没有错误。我不是 ruby​​ 专家,但你确定编码应该是“utf8”吗?我谷歌了一下,发现“编码:unicode”。是一样的吗?
  • 感谢@eppesuig 给了我另一个调查途径。这确实可能是一个愚蠢的红宝石问题!谢谢你回来。
  • 所以您发现它与 dbms 无关(这是因为 SELECT 显示相同的结果集)但是您有不同的 html 输出,它们都以 utf8 编码。您仍然有几个选择:1)您的应用程序在连接到 dbms 时设置了错误的编码; 2) 您的应用程序在连接到 dbms 时使用不同的转义序列(提示:检查您的 dbms 驱动程序的“standard_conforming_strings”等); 3)您的应用程序服务器使用其环境中的一些字符集设置。只是为了确定:当您将本地应用程序直接连接到生产 dbms 时会发生什么?

标签: ruby-on-rails-3 postgresql heroku encoding


【解决方案1】:

解决方案:

添加到 Rails.root/config/boot.rb

require 'yaml'
YAML::ENGINE.yamler = 'syck' 

【讨论】:

    猜你喜欢
    • 2010-09-18
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2020-01-19
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多