在Ruby中读取带有特殊字符的CSV文件并存储到SQL Server中
我正试图将Ruby(2.0.0)中的CSV文件(UTF-8编码)导入我的数据库(MSSQL 2008R2,在Ruby中读取带有特殊字符的CSV文件并存储到SQL Server中,ruby,sql-server,csv,special-characters,ruby-2.0,Ruby,Sql Server,Csv,Special Characters,Ruby 2.0,我正试图将Ruby(2.0.0)中的CSV文件(UTF-8编码)导入我的数据库(MSSQL 2008R2,COLLATION French_CI_AS),但特殊字符(元音上的法语重音)没有正确存储:变成jibberish 我使用这段代码读取文件: CSV.foreach(file, col_sep: ';', encoding: "utf-8") do |row| # ... end 我在CSV选项中尝试了各种编码(utf-8,iso-8859-1,windows-1252),但没有一个
COLLATION French_CI_AS
),但特殊字符(元音上的法语重音)没有正确存储:变成jibberish
我使用这段代码读取文件:
CSV.foreach(file, col_sep: ';', encoding: "utf-8") do |row|
# ...
end
我在CSV选项中尝试了各种编码(utf-8
,iso-8859-1
,windows-1252
),但没有一个能正确存储特殊字符
在您提问之前,我的数据库排序规则支持这些字符,因为我们已经成功导入了包含使用PHP导入器的字符的数据。如果我使用put
或文件记录器转储数据,则一切正常
我的代码是否有问题,或者是否需要指定其他内容(例如ruby类文件编码)
谢谢
编辑:数据保存由一个PHP REST API完成,该API可以很好地处理重音字符。它在接收数据时存储数据
在Ruby中,我解析数据,将其存储在一个对象中,然后在PUT请求体中发送JSON编码的对象。但是,如果直接从Ruby使用SQL查询,问题仍然存在:
query = <<-SQL
UPDATE MyTable SET MyTable_title = '#{row_data['title']}' WHERE MyTable_id = '#{row_data['id']}'
SQL
res = db.execute query
query=我认为这与您的CSV文件的编码类型有关,所以开始对此进行深入研究。我确实发现windows-1252编码将插入控制字符
您可以在此处阅读更多信息:您已经转储了数据,并且一切都是正确的,因为您使用utf-8
读卡器读取了utf-8
-编码文件。问题显然是在数据库中插入。您是否介意共享用于将其存储到数据库中的代码?我打赌用str.encode('iso-8859-1')
而不是仅仅用str
就能解决问题。编辑我的帖子回答你的问题。添加手动编码并不能解决问题,存储的值仍然是jibberish…API不能“很好地处理重音字符”,因为API没有“重音字符”的概念。它只接收一个ByTestStream并将其进一步传递给mysql适配器。mysqlclient\u encoding
参数必须与此ByTestStream的实际编码匹配,这一点很重要。因此,手动编码是必要的。我们使用PHP微框架和Doctrine2链接到数据库对象。我们从未对重音字符有过任何问题,如果它们在请求中被正确传递,它们将被正确存储。我无法理解“正确传递”是什么意思。UTF-8中的“ç”是2字节,ISO-8859-1中的相同符号是1字节。你认为什么是正确的?无论API是否需要ISO-8859-1,以及您是否一直通过ISO-8859-1,我建议您告诉ruby将结果也转换为ISO-8859-1。