2012-05-03 94 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