1

我遇到了这个问题,我有一个控制器接收一个字符串,该字符串分配给我的一个模型的属性,然后我将其保存到数据库中。带有检查调用的日志消息显示模型成功地获取了字符串,直到 #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'
4

2 回答 2

0

好吧,您正在使用utf8,但是如果您使用utf8_unicode_ci它可能会更好,还有另一种utf8_general_ci性能更好的编码,但如果出现问题,德语可能会出现问题,请使用utf8_unicode_ci用于数据库的 ,有关 MySQL 字符集的更多信息,请查看MySQL 的字符集-unicode 集。在 Rails 和 Ruby 方面,您应该检查这个问题,看看ruby​​ 中的法语口音。还有法语的 Rails 消息。作为最后一个资源,您可以在将数据插入数据库之前对数据进行 html 编码。这可能会使搜索混乱,但是如果您在搜索数据库之前也对搜索数据进行编码,那么一切都应该没问题,以获取更多信息,请检查rails 页面中的法语字符. 如果您不断收到错误,我希望这会有所帮助,请告诉我,以便我检查其他方法来帮助您。

@Ahmed Ali 的评论也可以帮助您,看起来编码已更改

从任何数据库(Mysql、Postgresql、Sqlite2 和 3)获取数据,全部配置为 UTF-8 作为其字符集,在 ruby​​ 1.9.1 和 rails 2.3.2.1 中返回具有 ASCII-8BIT 的数据。

有关完整答案,请参阅 Ahmed 发布的链接以及引用引用页面的链接(查询结果的 ASCII-8BIT 编码在 rails 2.3.2 和 ruby​​ 1.9.1 中)。

于 2013-07-12T19:30:55.657 回答
0

对不起,所有的烦恼。我只是把答案写下来。事实证明,在这种情况下,数据库已正确设置为 utf8,但用户正在输入以 ISO-Latin-1 编码的字符串,而我没有检查用户输入的编码方式,因为我假设所有输入都与 utf8 兼容. 结果证明 ISO-Latin-1 中的法语重音字符是非法的 utf8 字符。数据库似乎通过发出警告并在非法字符处截断字符串但将所有内容保留在其前面来处理它。

于 2015-06-18T22:43:56.853 回答