试图插入postgresql:得到错误

时间:2012-05-03 17:18:02

标签: ruby-on-rails postgresql encoding utf-8 data-migration

调用

http://localhost:3000/tempbizs

我使用tempbiz_controller的索引方法将数据从遗留数据库(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&瑜伽

2 个答案:

答案 0 :(得分:1)

您的文本编码与UTF-8不同,并且您尝试将其插入UTF-8数据库。 SQLite没有对文本编码做任何特殊处理,因此SQLite中的数据很好但对PostgreSQL无效。您需要查找非UTF-8的记录并手动转换它们以便迁移数据。

根本问题是您的应用程序未正确处理编码。用户能够以与UTF-8不同的编码提交数据,并且它一直到您的数据库。您需要通过并确保您的页面以UTF-8呈现,并且浏览器正在使用该编码进行表单提交。您可能还需要检查您的模型。随处可见该表。我怀疑你是否会在S.O.找到一个神奇的解决方案。除了深入研究你的代码并仔细检查一切。

答案 1 :(得分:0)

你告诉PostgreSQL你的一个varchar列是用UTF-8编码的。但是,您尝试输入的数据(0xCA5A)无效UTF-8。

因此,您需要弄清楚该值实际上是什么编码,然后在插入之前进行转换(或者,告诉PostgreSQL使用该编码)。

如果0xCA5A不应该是文本,那么你需要在PostgreSQL中使用二进制而不是文本类型。

你没有在SQLite中遇到过这种情况,因为SQLite在强制执行数据有效性方面做得不多。

它也可能是0xCA5A只是损坏,因为它在任何常见的编码中看起来都不正确:

  • ISO-8859-1,-15和cp1252:ÊZ
  • UTF16(大端):쩚
  • UTF16(小端):嫊
  • shiftjis:ハZ

如果它只是腐败,你需要过滤掉无效的记录。