我遇到了这个问题,我有一个控制器接收一个字符串,该字符串分配给我的一个模型的属性,然后我将其保存到数据库中。带有检查调用的日志消息显示模型成功地获取了字符串,直到 #save 调用。问题似乎是如果没有抛出任何错误,如果字符串包含法语字符,则从该字符到字符串末尾的字符串会被截断。
进一步的调查似乎表明该字符串在写入 MySQL 数据库时会被截断。我还看到了这篇文章:Stale Rails Issue
如果我没看错,看起来不在 ASCII 字符编码中但在 ISO Latin-1 字符编码中的字符会受到此错误的影响。实际上,我将我的项目从 Rails 3.0 升级到 Rails 3.2,从 Ruby 1.8 升级到 Ruby 1.9,所以我可以轻松地将 mysql2 适配器与 Rails 一起使用,其他一些文章似乎建议这可能会解决这个问题。然而它没有。
那么如何防止字符串截断发生呢?
Edit1:如果我输入查询SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
,我会得到:
Variable Name, Value
'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'utf8'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'latin1'
'character_set_system', 'utf8'
'collation_connection', 'utf8_general_ci'
'collation_database', 'utf8_unicode_ci'
'collation_server', 'latin1_swedish_ci'
我还注意到,如果我通过 MySQL 查询浏览器输入法语字符,然后在我的浏览器上刷新 rails 应用程序,以便从它显示的数据库中提取新数据,它会正确显示。保存模型数据时似乎将其删除。
Edit2:我只是更改了一些配置参数以尝试解决问题,但它仍然存在。但是,这就是我将值更改为的值。
Variable Name, Value
'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'utf8'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'utf8'
'character_set_system', 'utf8'
'collation_connection', 'utf8_general_ci'
'collation_database', 'utf8_unicode_ci'
'collation_server', 'utf8_unicode_ci'