SQLite Instr 提供的值与预期不同

Posted

技术标签:

【中文标题】SQLite Instr 提供的值与预期不同【英文标题】:SQLite Instr provides different value than expected 【发布时间】:2021-07-10 15:17:58 【问题描述】:

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

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

提供 64 的结果。

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

【问题讨论】:

【参考方案1】:

来自INSTR()

instr(X,Y) 函数查找字符串 Y 的第一次出现 字符串 X 并返回前面的字符数加 1,如果 Y 则返回 0 在 X 中找不到任何位置。或者,如果 X 和 Y 都是 BLOB,则 instr(X,Y) 返回比第一个之前的字节数多一个 出现 Y,如果 Y 不在 X 中的任何位置出现,则为 0。

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

如果您想要将 ZSYNCPAYMENT'"t' 转换为 BLOBs 的字节差异:

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

查看简化的demo。

【讨论】:

这很有效,谢谢!但是,我在理解定位差异时遇到了问题。所以我在 DB Browser 中查看数据,同样的,计算每个字符,我得到 71。所以我只是不明白 SQLite 命令从哪里得到 64。感谢您的帮助,我真的很感激! @SnakeDoc65 有关 unicode 字符的更好解释,您可以阅读此主题:***.com/questions/5290182/… 例如,在演示中,我提供了 unicode char 'Ä' 虽然只有 1 个字符,但它存储在 2 个字节中而不仅仅是 1 像其他字符。 INSTR() 计算字符串的字符数和 BLOB 的字节数。 也许你能帮我更进一步。在我的数据库以及您的演示中,我应用了以下命令: SELECT substr(ZSYNCPAYMENT, INSTR(cast(ZSYNCPAYMENT as blob), cast('"t' AS BLOB))) FROM ZPAYMENT您的演示(使用上述命令编辑)以产生与 "t156.但是,返回的一个值是 "t156,另一个是 "t156.由于 instr() 函数,我认为它会告诉 substr 我想要拉出的子字符串所在的位置。如果这有意义的话。 @SnakeDoc65 您还必须将 SUBSTR() 的第一个参数强制转换为 BLOB。检查这个:dbfiddle.uk/… 你是我的英雄。谢谢!

以上是关于SQLite Instr 提供的值与预期不同的主要内容,如果未能解决你的问题,请参考以下文章

在 Apple Swift 中将字符串转换为浮点数产生的值与模块错误不同

Sqlite 返回值与数据库不同

如果值与预期不同,则查找文件类型并验证是不是存在替换行

SRI 哈希不是预期的

SQLite executemany 要求比预期更多的值

sql 如何以逗号为分隔符分割一个字段的值