0

在调用

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 & Yoga

4

2 回答 2

1

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

根本问题是您的应用程序没有正确处理编码。用户能够以与 UTF-8 不同的编码方式提交数据,并且一直到您的数据库。您需要检查并确保您的页面以 UTF-8 呈现,并且浏览器正在使用该编码进行表单提交。您可能还需要检查您的型号。查看访问此表的所有位置。我怀疑你会在 SO 上找到一个神奇的解决方案,而不是去挖掘你的代码并仔细检查所有内容。

于 2012-05-03T17:27:56.417 回答
0

您已经告诉 PostgreSQL,您的 varchar 列之一是用 UTF-8 编码的。但是,您尝试放入其中的数据 (0xCA5A) 不是有效的 UTF-8。

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

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

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

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

  • ISO-8859-1、-15 和 cp1252:ÊZ
  • UTF16(大端):쩚</li>
  • UTF16(小端):嫊</li>
  • shiftjis:ハZ

如果只是损坏,则需要过滤掉无效记录。

于 2012-05-03T17:33:24.603 回答