Rails MySQL编码问题/疑问 - Mysql :: Error:Illegal mix of collations(latin1_swedish_ci,IMPLICIT)和(utf8_general_ci,COERCIBLE)

11
Rails 2.3.5和Ruby 1.8.7以及Mysql 5.1.53
我正在加载一个包含商标符号“TM”的字段的CSV文件。
Tart Deco™ - 看起来像这样
我正在尝试进行活动记录查找:
Influencer.find(:first,:conditions => ["author_name = ? and url_discovered = ?",author_name,site_profile_url])
Mysql :: Error:Illegal mix of collations(latin1_swedish_ci,IMPLICIT)and(utf8_general_ci,COERCIBLE)for operation '=':SELECT * FROM influencers WHERE(author_name ='Tart Deco?' and url_discovered ='http://www.joelnylund.com')LIMIT 1
在Ruby调试器中,字符串显示为: p author_name "Tart Deco \ 231"
我的表被编码为“utf8_general_ci”。
那么我该怎么办? 我不太在乎是否存储TM,这很好,主要是我不想出问题...

现在只能使用不好的解决方法,删除非ASCII字符 - https://dev59.com/HHM_5IYBdhLWcg3wslbs - Joelio
4个回答

16

1

你的问题与 Ruby 1.8 及其字符编码管理有些相关。尝试使用 Iconv 强制将从 CSV 读取的文本从 ASCII 转换为 UTF8。

以下是一个简单的示例:

 csv_text = SOME_CSV_READ_CODE # get the string or text
 # instantiate a Iconv converter from generic ASCII to UTF8, ignoring errors
 converter = Iconv.new('UTF-8//IGNORE', 'ASCII//IGNORE')
 # clean string from unrecognized chars 
 utf8_text = converter.iconv(csv_text).unpack('U*').select{ |cp| cp < 127 }.pack('U*')

在您的情况下,在使用查询之前,您应该转换(至少)author_name参数。确保在将文本/字符串保存到数据库时执行相同操作,否则在插入/更新期间会出现类似的错误。

1
也许这不是最有帮助的答案,但我刚刚在Rails 3 w/ Ruby 1.9.2中组合了一个样本测试,它可以正常工作。我知道在Ruby 1.9中,字符编码进行了重大改进。
注意:在我的测试中,我只是复制了你的文本,并在rails控制台中运行。
:001 > author_name = 'Tart Deco™'
=> "Tart Deco™"
:002 > Influencer.find(:first,:conditions => ["author_name = ?", author_name])
=> nil 

当然,我只是虚构了一个没有记录的 Influencer 模型。但 MySQL 没有出现错误。所以,我添加了一个带有该名称的记录到我的模型中,它成功地检索到了。

希望对你有帮助。


我现在无法更改Ruby或Rails版本。 - Joelio
Ruby 1.9.2拥有更好的字符串编码处理程序。这与Rails无关。 - Andrea Pavoni

0
我想问一个关于如何加载数据的问题,但显然“编辑队列已满”。你是使用 rails 加载文件并将其推入数据库中,还是使用 MySQL 选项之一,如“load data... infile...”?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接