【问题标题】:ActiveRecord ArgumentError: negative string size (or size too big)ActiveRecord ArgumentError:负字符串大小(或大小太大)
【发布时间】:2012-05-21 18:32:14
【问题描述】:

这几天我一直在使用它。这是 ActiveRecord 错误和应用程序跟踪。

ArgumentError: negative string size (or size too big): 
EXEC sp_executesql N'SELECT [ops_jobs_join].* FROM [ops_jobs_join] 
WHERE (work_center_id = N''M*1053'' OR work_center_id = N''M*1035'' OR
      work_center_id = N''M*1037'' OR work_center_id = N''M*1036'') AND
      (status != N''C'') AND (start_date != N'''') AND 
      (start_date >= N''20120516'') AND (comp_date <= N''20120527'') AND 
      (work_order NOT LIKE N''LA%'') 
ORDER BY work_center_id ASC, start_date ASC, starting_shift_num ASC, 
      status ASC, priority ASC, comp_date ASC, ending_shift_num ASC, 
      due_date ASC, sequence_number ASC'

事实证明,如果我调用 Op.all,我会收到此错误:

ActiveRecord ArgumentError: 负字符串大小(或大小太大)

如果我忽略使用可能包含 unicode 字符的列,它可以正常工作。所有数据都毫无问题地存储在数据库中,但由于某种原因 rails3 没有它。

有些 where 子句会返回记录,而另一些会导致相同的错误:

activerecord-sqlserver-adapter (3.2.4) lib/active_record/connection_adapters/sqlserver/database_statements.rb:421:in `fetch_all'

跟这两个帖子差不多:

似乎第一篇文章中的解决方案是更改我想避免的 gem。

我查看了我的表格,我认为我没有使用任何关键字作为字段名称。

我使用与此类似的其他查询,它们工作正常。唯一的区别是我在 where 子句中使用的值 (work_center_id = N''M*1053'')。

【问题讨论】:

  • 这可能是因为您的 SQL-Server 数据库的排序规则和 ActiveRecord 期望使用的编码不匹配。有关类似问题,请参阅here。你能发布它们是什么吗?
  • 我的数据库的排序规则是 SQL_Latin1_General_CP437_CI_AS,我不确定 ActiveRecord 的预期。我会尝试研究它。我确实知道我有其他数据库具有相同的排序规则,它们运行良好。
  • 我认为问题是我的列之一包含 unicode 字符。数据库处理 unicode 很好,但 rails 不会。虽然我知道 rails 应该处理 unicode。
  • 请用解决方案回答您自己的问题并接受它,以便其他人可以看到它已得到解决。编辑问题标题不是办法。

标签: ruby-on-rails activerecord


【解决方案1】:

Rails 对数据进行操作的默认编码是 UTF8,您也需要在数据库中使用这种编码。 改变它,一切都会好起来的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多