mysql预处理语句是否有限制参数大小?

时间:2019-03-04 16:33:11

标签: mysql ruby rubygems

好的,我已经坚持了好几次了。我想使用mysql gem用xml文件中的数据填充数据库,但是当我尝试执行准备好的语句时遇到问题。

@dbi = Mysql.new(@host,@userid,@pwrd,@database)

query = "INSERT IGNORE INTO sha1( sha1_date, sha1) VALUES (? , ?) "
@prep = @dbi.prepare(query)
res = @prep.execute( ir.date, ir.sha1)
#this first query works, i can find the inserted row in the DB

@prep = @dbi.prepare("SELECT id FROM sha1 WHERE sha1 = ?")
res = @prep.execute(ir.sha1)
puts res.fetch
#but here the prepared statement return an empty string.

我希望能够进行这样的SELECT,因为最终查询看起来像这样

    query = "INSERT INTO integration_job(sha1_id, branch_id, integration_stage_id, status_id, name) VALUES (
  (SELECT id FROM sha1 WHERE sha1 = ?),
    (SELECT id FROM branch WHERE name = ?),
    (SELECT id FROM integration_stage WHERE name = ?),
    (SELECT id FROM integration_status WHERE name = ?),
    ?)"
@prep = @dbi.prepare(query)
res = @prep.execute(ir.sha1, ir.branch, ir.stage, ir.status, ir.job

我尝试对其他表执行相同类型的查询,并且它起作用了。我的猜测是我传递给execute()方法的参数太长了。

puts ir.sha1 # => dba759e168e734fcc2eaf114269879177ef6a0b1

但是我找不到有关参数限制大小的信息,所以我真的不知道该怎么办。

所以我有几个问题:

  • execute()方法参数是否有限制大小? (如果是,那是什么?)
  • 我如何解决此问题,并准备具有相同结果但不使用sha1作为参数的准备好的语句? 使用另一种宝石是一个主意,但我不知道是哪一个

[编辑] 好的,我找到了解决方案,只是我将存储sha1的VARCHAR字段的大小限制为40个字符。 (它使我感觉sha1 IS长40个字符)但是sha1的解析为字符串增加了一个尾行字符,使其长度为41个字符。我用gsub(“ \ n”)删除了它,现在一切正常。

感谢您的评论,他们对此有所不同。

0 个答案:

没有答案