【问题标题】:SQLite/FoxPro Update can't find record using = but finds it using LIKESQLite/FoxPro 更新使用 = 找不到记录,但使用 LIKE 找到它
【发布时间】:2017-04-07 10:33:53
【问题描述】:

我正在将 FoxPro 数据库转换为 SQLite,并将说明迁移到更新,但我发现了问题。

如果在 FoxPro 中我使用 Update Fact01 set Motivo = 'asdfgh' where TipoDoc='FV' 行未更新。

但如果我使用Update Fact01 set Motivo = 'asdfgh' where TipoDoc Like 'FV',行会改变。

如果我在 SQLite 引擎中执行第一条指令,行也会改变。 TipoDoc 的字段类型是 NChar(2)。

另外,如果我在 Foxpro 中执行 select * from Fact01 where TipoDoc ='FV' 语句,它可以正常工作。

知道这里发生了什么吗?

【问题讨论】:

  • SELECT typeof(TipoDoc), hex(TipoDoc) FROM Fact01 WHERE TipoDoc LIKE 'FV' 的输出是什么?
  • @CL。 typeof(TipoDoc) 的输出是 Text,而 Hex 返回 4656
  • 等等,问题发生在 FoxPro 中?那为什么标题里有“SQLite”呢?
  • @CL。抱歉,已更新标题
  • VFP 没有 nchar 或 text 数据类型。目前尚不清楚您是通过 ODBC 驱动程序对 VFP 表还是 SQLite 表运行查询。 = 和 Like 之间的基本区别在于后者是 ANSI。如果你使用 set ansi on 会发生什么?

标签: sqlite visual-foxpro


【解决方案1】:

我不确定这是否是由于 Nchar 可以存储 unicode 数据或一般数据的存储方式。将 ALLTRIM 包裹在 WHERE 子句周围可能会解决问题。

Update Fact01 set Motivo = 'asdfgh' where ALLTRIM(TipoDoc)='FV'

【讨论】:

    【解决方案2】:

    这发生在我身上,因为我将列值存储为 BLOB 而不是 TEXT。结果发现 BLOB 值小于 TEXT 值,因此 LIKE 找到匹配但 = 没有。您可能遇到了同样的问题。

    【讨论】:

    • 正如我所说,SQLite 中的列是 NChar,而 FoxPro 中的结果(如上面的 cmets 中所述)是 Text...
    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2013-05-01
    • 2020-12-09
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多