在Ruby中读取包含特殊字符的CSV文件并存储到SQL Server中

问题描述:

我试图将Ruby(2.0.0)中的CSV文件(UTF-8编码)导入到我的数据库(MSSQL 2008R2,COLLATION French_CI_AS)中,但特殊字符(法语元音元音)没有正确存储:éèçôü变为éèçôü(或其他类似的乱码)。在Ruby中读取包含特殊字符的CSV文件并存储到SQL Server中

我用这段代码读取文件:

CSV.foreach(file, col_sep: ';', encoding: "utf-8") do |row| 
    # ... 
end 

我试图在CSV选项(utf-8iso-8859-1windows-1252)各种编码,但没有人会正确地存储的特殊字符。

在您提出问题之前,我的数据库整理支持这些字符,因为我们已成功导入包含使用PHP导入程序的数据。如果我使用puts或文件记录器转储数据,那么一切都是正确的。

我的代码有问题吗?或者我需要指定其他内容(例如ruby类文件编码)?

感谢

编辑:的数据保存是由PHP的REST API,正常工作与重音字符完成。它按收到的数据存储数据。

在Ruby中,我解析数据,将其存储在一个对象中,然后将JSON编码的对象发送到我的PUT请求的正文中。但是,如果我直接使用SQL查询从红宝石,问题依然存在:

query = <<-SQL 
    UPDATE MyTable SET MyTable_title = '#{row_data['title']}' WHERE MyTable_id = '#{row_data['id']}' 
SQL 
res = db.execute query 
+0

您有倾倒的数据,一切是正确的,因为你阅读'UTF-8'读者'UTF-8'编码的文件。问题显然在_inserting into database_中。你介意分享你用来存储到数据库中的代码吗?我敢打赌,把str.encode('iso-8859-1')'而不是只是'str'就能解决问题。 – mudasobwa

+0

编辑我的帖子来回答你的问题。添加一个手动编码并不能解决问题,存储的值仍然是乱码... – 3rgo

+0

由于没有API的“重音字符”概念,API不能“与重音字符一起工作”。它只是接收一个字节流并将其传递给mysql适配器。重要的是,mysql'client_encoding'参数_必须匹配这个字节流的真实编码。所以,手动编码是必要的。 – mudasobwa

我在想,这有一些东西需要与您的CSV文件的编码类型,所以开始在周围挖。我确实发现windows-1252编码会插入控制字符。

你可以阅读更多关于它在这里:Converting special charactes such as ü and à back to their original, latin alphbet counterparts in C#