SQLite/FoxPro 更新无法使用 = 找到记录但使用 LIKE 找到它
SQLite/FoxPro Update can't find record using = but finds it using LIKE
我正在将 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'
语句,它工作正常。
知道这里发生了什么吗?
这发生在我身上,因为我将列值存储为 BLOB 而不是 TEXT。结果是 BLOB 值小于 TEXT 值,所以 LIKE 找到了匹配但 = 没有。你可能遇到了同样的问题。
我不确定这是因为 Nchar 可以存储 unicode 数据还是一般数据的存储方式。将 ALLTRIM 环绕在 WHERE 子句周围可能会解决该问题。
Update Fact01 set Motivo = 'asdfgh' where ALLTRIM(TipoDoc)='FV'
我正在将 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'
语句,它工作正常。
知道这里发生了什么吗?
这发生在我身上,因为我将列值存储为 BLOB 而不是 TEXT。结果是 BLOB 值小于 TEXT 值,所以 LIKE 找到了匹配但 = 没有。你可能遇到了同样的问题。
我不确定这是因为 Nchar 可以存储 unicode 数据还是一般数据的存储方式。将 ALLTRIM 环绕在 WHERE 子句周围可能会解决该问题。
Update Fact01 set Motivo = 'asdfgh' where ALLTRIM(TipoDoc)='FV'