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

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

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

提供 64 的结果。

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

【问题讨论】:

    标签: sqlite unicode blob instr


    【解决方案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 字符的更好解释,您可以阅读此主题:stackoverflow.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/…
    • 你是我的英雄。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多