ruby-on-rails - rails 3,Heroku : Taps Server Error: PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xba

标签 ruby-on-rails ruby-on-rails-3 postgresql utf-8 heroku

我有一个 Rails 3.0.9 应用程序,既在我的开发环境中本地运行,又在 heroku 应用程序上远程运行。我有 a method that imports a CSV file into a model ,并且此文件可以包含非英语字符,例如 °、á、é、í 等(它是西类牙语)。

我目前能够在我的本地开发 (SQLite) 数据库中毫无问题地导入完整文件(75k 条记录);但是,当使用 heroku db:push 将数据库上传到 heroku 时,失败并出现我在标题中发布的错误:

!!! Caught Server Exception

HTTP CODE: 500
Taps Server Error: PGError: ERROR:  invalid byte sequence for encoding "UTF8": 0xba
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".

显然,Heroku 在插入“°”字符时遇到问题。 (目前该文件没有任何 á、é、í 等字符,但我怀疑这些也可能会失败。)

我在我的application.rb 文件中设置了默认编码,如下所示:

#.../application.rb
config.encoding = "utf-8"

我还能做些什么来设置“客户端编码”并解决这个问题?

最佳答案

numero sign , º, 在 ISO-8869-1 中是 0xBA不是 UTF-8。所以你的 CSV 文件是用 Latin-1 编码的,但你试图将它作为 UTF-8 存储在你的数据库中而不修复编码。

您可以尝试告诉您的 CSV 库它正在处理 Latin-1 编码的文本,也许它会负责转换为 UTF-8。如果这不起作用,那么您可以自己使用 Iconv 来完成:

ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xba")
 => ["º"]
ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xb0")
 => ["°"]

使用 SQLite 不会有问题,因为 SQLite 非常宽容,而且它有一个非常松散的类型系统。 PostgreSQL,OTOH,如果您尝试向其提供无效数据,往往会相当严格并且会适本地提示。如果您要部署到 Heroku 和 PostgreSQL,我建议您停止在 SQLite 上进行开发,还有其他差异会导致问题(例如 GROUP BY 和 LIKE 的行为)。

关于ruby-on-rails - rails 3,Heroku : Taps Server Error: PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xba,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423519/

相关文章:

postgresql - 数组列上的 Postgres 全文搜索

ruby-on-rails - 使用 Vpim Gem 创建公司名片

ruby-on-rails - gmaps4rails 默认设置为地形 View

ruby-on-rails-3 - Rails 3 的基础应用程序不错吗?

ruby-on-rails - ruby on Rails : Rails. cache.write 对于特定对象字段数组返回 false

ruby-on-rails - 从随机 :id to :username in rails 更改路由 URL

ruby-on-rails - 在 Ruby on Rails 上创建我自己的评论/问答系统,还是只使用 Disqus 或 Intense Debate?

ruby-on-rails - 占用大量内存

使用表分区调整 PostgreSQL 性能

django - 在 Django 中使用 PostgreSQL 聚合表达式