SQLite Instr 提供与预期不同的值

SQLite Instr provides different value than expected

我正在尝试使用 instr 在查询中提取子字符串。以下命令:

SELECT instr(ZSYNCPAYMENT, '{"t') 
FROM ZPAYMENT;

结果为 64。

我将 SELECT ZSYNCPAYMENT FROM ZPAYMENT 的输出复制并粘贴到一个十六进制编辑器中,并选择了直到并包括 { 符号的字节数,这是我上面的 instr 函数的一部分。所选字节数显示为 71 的十进制长度。为什么我的 instr 输出显示值为 64?下面的屏幕截图是上面 SELECT ZSYNCPAYMENT 的输出。

来自INSTR()

The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. Or, if X and Y are both BLOBs, then instr(X,Y) returns one more than the number bytes prior to the first occurrence of Y, or 0 if Y does not occur anywhere within X.

在您使用的十六进制编辑器中,您会看到字符串 '{"t' 的位置与 ZSYNCPAYMENT 的值之间的差异 字节 .
当字符串包含 unicode 字符时,这与 characters 的差异不同,我怀疑您在图片中发布的字符串就是这种情况。

如果你想要字节的差异,将 ZSYNCPAYMENT'{"t' 都转换为 BLOBs:

SELECT INSTR(
         CAST(ZSYNCPAYMENT AS BLOB), 
         CAST('{"t' AS BLOB)
       ) 
FROM ZPAYMENT 

查看简化版 demo.