【问题标题】:SQLite strings with NUL带有 NUL 的 SQLite 字符串
【发布时间】:2011-05-02 06:01:23
【问题描述】:
  1. SQLite 3 中的字符串可以包含NUL 字符吗?
  2. 如果 1 的答案是“是”,那么它们如何写在 SQL 查询中? SQLite 似乎没有 chrchar 函数。

【问题讨论】:

  • 使用包含 NUL 字符的字符串是有风险的,我不知道它们是否会在 SQLite 中中断,但它们有可能在其他处理 nul 终止字符串的工具中被裁剪。
  • 我想知道使用 blob 是否更合适。问题是你不能只使用标准的 INSERT,我认为你必须绑定它。我对此知之甚少,无法更进一步,但我也希望得到答案。
  • 我目前正在使用 blob,但如果知道字符串是否也可以使用,那就太好了。
  • 出于好奇,为什么需要在字符串中使用 NUL? NUL 结束字符串,在字符串中使用它们只是自找麻烦,恕我直言。

标签: sqlite null-character


【解决方案1】:

不确定从哪个版本开始支持,但您可以做到:

create table foo (bar data);
insert into foo(bar) values (x'001122334400ff');
select length(bar),hex(bar),bar from foo;

【讨论】:

  • 这是一个 blob(在 cmets 中已经提到过),而不是字符串。
  • 在 sqlite 中,任何 blob 数据最终都会成为一个 blob,而不管列声明(以及隐含的亲和性)。请参阅sqlite.org/datatype3.html 的“列关联行为示例”下的示例,该示例演示了这一点。
【解决方案2】:

一般来说,不——SQLite 内部不是 8 位干净的,可能是由于它的 Tcl 遗产。虽然 NUL 不会导致损坏问题,但 SQLite 通常会在第一个嵌入的 NUL 字符处停止处理字符串。

即使对于像 GLOB 这样的运算符也是如此。例如,当您嵌入了 NUL 字符时,您无法将 BLOB 列与 GLOB 匹配,例如这个

select * from table where blobcol glob x'00022a';

将只匹配空 blob 值:虽然您可以使用文字 BLOB 语法(即x'hexdigits')并在使用字符串的地方使用结果值,但 SQLite 通常只使用第一个 NUL 之前的部分。

至少,。这是包括 SQLite 3.26.0 在内的情况。

请注意,SQLite 也有一个 BLOB 类型,它可以毫无问题地存储嵌入式 NUL,但 SQLite 中几乎没有使用它们的功能,而且它们通常更难从 SQL 接口库中使用。

它们还在许多上下文中静默转换为字符串,此时嵌入式 NUL 再次开始引发问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-12
    • 2014-08-18
    • 2018-07-27
    • 2018-02-17
    • 2013-02-04
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    相关资源
    最近更新 更多