2012-05-03 101 views
0

在具有tempbiz_controller的索引方法从旧的数据库(sqlite3的)数据迁移到我的滑轨应用程序内的另一个的PostgreSQL试图插入的PostgreSQL:得到错误

http://localhost:3000/tempbizs 

Im的调用。

它插入了一些记录。但是我看到它抛出下面的错误这是显示在我的浏览器了:

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美体健身&瑜伽

+0

请提供您在错误信息中插入的数据。 –

+0

此条目导致了问题RonZalkoTotal身体健康和瑜伽 – banditKing

+0

您可以在文本编辑器中打开您的csv文件,告诉您看到了什么编码(并且可以对其进行修改。尝试使用'gVim',您可以使用':encoding UTF -8'),然后你会看到你试图把什么编码放入数据库。 –

回答

1

你有不同的编码文本而不是UTF-8,并且您试图将其插入到UTF-8数据库中。 SQLite对文本编码没有特别的作用,所以数据在SQLite中没有问题,但对PostgreSQL无效。您需要查找并非真正使用UTF-8的记录,并手动转换它们以迁移数据。

潜在的问题是您的应用程序没有正确处理编码。用户能够以不同于UTF-8的编码格式提交数据,并且一直到达您的数据库。您需要经过并确保您的页面以UTF-8呈现,并且浏览器使用该编码进行表单提交。你可能也需要检查你的模型。无处不在查看此表格。我怀疑你会在S.O.上找到一个神奇的解决方案。除了去挖掘你的代码并仔细检查一切。

+0

嗨,感谢您的回复。我对此很新颖。这是我第一次执行此操作。然后将excel文件中的数据转换为.csv文件,然后将其导入到sqlite3数据库中,然后将其插入到pgsql中。它不是源于网页。我试图用这些数据预先填充我的Rails应用程序。 所以我没有意识到这一点,直到它真的打破。因为我只是在学习能否请你告诉我如何检查我的数据库行中的不正确的格式?我的意思是,当我查看该行时,我怎么知道它不是右格式?格式是正确的格式? – banditKing

+1

以UTF-8编码方式在文本编辑器中打开CSV文件。寻找问题角色。用不同的编码重新打开文件,直到角色看起来正确。然后使用命令行中的'iconv'将该编码转换为正确的编码。然后重新导入到sqlite,然后它应该重新导入PostgreSQL成功。 –

0

你已经告诉PostgreSQL你的一个varchar列是用UTF-8编码的。但是,您要输入的数据(0xCA5A)不是有效的UTF-8。

所以,你需要弄清楚这个值究竟是什么编码,然后在插入之前进行转换(或者告诉PostgreSQL使用该编码)。

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

你没有在SQLite中遇到过这个问题,因为SQLite在执行数据有效性方面做得并不多。

它也有可能是0xCA5A就是腐败,因为它没有任何共同的编码右看看:

  • ISO-8859,-15,和CP1252:EZ
  • UTF16(大端):쩚
  • UTF-16(小端):嫊
  • SHIFTJIS:ハž

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

+0

谢谢,是的。我手动通过数据库。将来,我将在迁移之前检查数据库的字符编码。在sqlite浏览器的任何想法,我可以找到这个? – banditKing

+0

@banditKing那么,如果你在你的SQLite浏览器中发现这行,它可能会显示奇怪。但是我认为在Ruby中这样做会更好。只需检查每行字符列(每行)以查看其有效的UTF-8,并且将任何列的主键吐出,以便您可以手动调查。根据问题的严重程度,您可能会发现必须手动检查整个数据库 - 或者,考虑您对数据来源​​的描述,修复从Excel导入。 – derobert

+0

感谢您的指点。是的,我需要做一点工作。这是我第一次,我不知道。我会牢记在心。感谢你的帮助。 – banditKing