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'
转换为 BLOB
s 的字节差异:
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 提供的值与预期不同的主要内容,如果未能解决你的问题,请参考以下文章