代码之家  ›  专栏  ›  技术社区  ›  Gary

Tcl API中的SQLite“:”样式参数替换:为什么将此整数视为条件中的字符串?

  •  1
  • Gary  · 技术社区  · 2 年前

    我可能又在做一些愚蠢的事情,但我不理解下面查询中的参数替换。该列 char_len 声明为整数。

    Tcl变量 selEnd 在SQLite查询中,它被替换为字符串,因为该查询返回所有行,就好像条件始终为true一样。我应该写的 selENd 显示在查询中 UNION ALL 在里面 WHERE 线 and p.char_len + p.char_bgn <= :selEnd

    如果 selEnd 已更改为 set selEnd [expr {799+1}] 则只返回应该返回的行。

    如果在CLI或SQLite Fiddle中使用 .param set :selEnd 800 然后 selEnd 被视为整数。如果我只是打字 800 而不是 :selEnd 则返回正确的行。

    If变量 SQL 使用双引号而不是大括号设置,并且条件更改为使用 $selEnd 第页,共页 :selEnd ,将返回正确的行。

    我有什么不理解的结果 :selEnd 被视为 '800' 而不是 800 使用大括号设置时 SQL ?

    我以为Tcl把所有的东西都当作字符串,直到它被“用来”做某事。和 SQL 只是一个字符串 selEnd 将插入为 800 ;但是,似乎 :selEnd -类型参数替换决定 selEnd 是一个字符串,应插入为 '800' 为什么?

    非常感谢。

    set docId 1
    set selStart 500
    set selEnd 800; #[expr {799+1}]
    
    set SQL {\
    with recursive
    pieces( order_idx, doc_id, key, buffer_id, char_start, char_len, char_bgn ) as
    (
      select
         0,
         r.*,
         0
      from
        pt_pointers r
      where
            r.key = (select order_keys->>0 from ur_maps where doc_id = :docId)
        and r.doc_id = :docId
    
      UNION ALL
    
      select
         order_idx + 1,
         r.*,
         p.char_len + p.char_bgn
      from pt_pointers as r, pieces p
      where r.key = (select order_keys->>(order_idx+1) from ur_maps where doc_id = :docId)
        and p.char_len + p.char_bgn <= :selEnd
        and r.doc_id = :docId
    )
    select *
    from pieces;\
    }
    
    db eval $SQL {
      chan puts stdout "$order_idx, $doc_id, $key, $buffer_id, $char_start, $char_len, $char_bgn"
    }
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Gary    2 年前

    我在SQLite论坛上问了这个问题 Dr. Hipp's answer 是:

    在TCL,一切都是一串,至少在理论上是这样。在发动机罩下, TCL跟踪整数和浮点值等等。 但我们的想法是,在开发人员级别,一切都像 是一根纯粹的绳子。(事实上,在Tcl8.0之前 一直都是一根绳子。其他数据类型在Tcl8.0中介绍为 优化。)

    SQLite偏离了TCL中所有东西都是字符串的想法。 绑定时,如果底层TCL值具有某种表示形式 除了字符串,SQLite尝试使用这种替代表示。 从技术上讲,这违反了规则,对此我一直 受到指责。但现在的设计不可能不被打破 兼容性,所以它就是这样。

    通常,Tcl/SQLite接口在没有 开发者必须考虑一下。但如果你 复杂的情况,就像你看起来的那样,那么 铸造您的绑定

    推荐文章