Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqlite的模式匹配不起作用的原因可能是什么?_Sqlite_Sql Like - Fatal编程技术网

sqlite的模式匹配不起作用的原因可能是什么?

sqlite的模式匹配不起作用的原因可能是什么?,sqlite,sql-like,Sqlite,Sql Like,我有一个包含日志数据的数据库文件。数据库包含一个表日志,该表包含一列MSG。表中有30行,其中MSG列包含行末尾的字符串: $ sqlite3 log.db "select msg from log" | grep down$ | wc -l 30 但当我试图用LIKE找到它们时,却找不到匹配项: $ sqlite3 log.db "select msg from log where msg like '%down'" | grep down$ | wc -l 0 这可能是什么原因 更新:M

我有一个包含日志数据的数据库文件。数据库包含一个表日志,该表包含一列MSG。表中有30行,其中MSG列包含行末尾的字符串:

$ sqlite3 log.db "select msg from log" | grep down$ | wc -l
30
但当我试图用LIKE找到它们时,却找不到匹配项:

$ sqlite3 log.db "select msg from log where msg like '%down'" | grep down$ | wc -l
0
这可能是什么原因

更新:MCVE

我不知道为什么从VARCHAR到VARCHAR的转换会产生不同

更新:另一个MCVE


我会把它粘贴到评论中,但是格式看起来很难看。这对我很有用:

$ sqlite3 log.db
SQLite version 3.24.0 2018-06-04 14:10:15
Enter ".help" for usage hints.
sqlite> create table log (id int, msg text);
sqlite> insert into log values (1,'database is down');
sqlite> insert into log values (2,'database is down');
sqlite> insert into log values (3,'database is down');
sqlite> ^D
$ sqlite3 log.db "select msg from log" | grep down$ | wc -l
       3
$ sqlite3 log.db "select msg from log where msg like '%down'" | grep down$ | wc -l
       3

您能否共享日志表的内容,以便我可以尝试重现您的问题?

鉴于您的示例数据以及您在不同版本的sqlite上看到的结果,以下是我确信正在发生的事情

首先,您要在表中插入blob,而不是字符串。这些blob存储不变,而不是像您正在使用的具有文本相关性的列那样转换为字符串。有关列关联和隐式数据类型转换的详细信息,请参阅

其次,不匹配这些blob的sqlite3实例是在打开配置选项的情况下生成的,而匹配它们的实例是在关闭默认设置的情况下生成的

如果任一操作数是BLOB,此编译时选项将导致LIKE运算符始终返回False。LIKE的默认行为是在比较完成之前将BLOB操作数转换为文本


如果您检查输出,您应该能够验证是否正在使用它。

仅查询本身而不返回管道的其余部分是否会返回任何内容?请显示select*from LOG的内容如果MSG作为字符串文字“facility=daemon”输入,它是否工作得更好;组件=命名;text=正在关闭',而不是十六进制值?是否可以尝试转储字符串内容,从LOG?..@pascal中选择hexMSG十六进制字符串是相同的。是的,它是正确的:不工作的版本启用了LIKE_DOESNT_MATCH_blob。但您引用的文档中指出,默认情况下,blob被转换为文本。默认行为是它与未定义该选项的版本匹配的原因。
CREATE TABLE LOG (MSG VARCHAR(6291456) NOT NULL);

INSERT INTO LOG VALUES (X'666163696c6974793d6461656d6f6e3b636f6d706f6e656e743d6e616d65643b746578743d7368757474696e6720646f776e');
INSERT INTO LOG VALUES ('facility=daemon;component=named;text=shutting down');

SELECT ROWID,MSG FROM LOG;                                         -- returns both rows

SELECT ROWID,MSG FROM LOG WHERE MSG LIKE '%down';                  -- returns just the second

SELECT ROWID,MSG FROM LOG WHERE MSG LIKE '%down%';                 -- returns just the second

SELECT ROWID,MSG FROM LOG WHERE CAST(MSG AS VARCHAR) LIKE '%down'; -- returns both rows

SELECT HEX(MSG) FROM LOG;
$ sqlite3 log.db
SQLite version 3.24.0 2018-06-04 14:10:15
Enter ".help" for usage hints.
sqlite> create table log (id int, msg text);
sqlite> insert into log values (1,'database is down');
sqlite> insert into log values (2,'database is down');
sqlite> insert into log values (3,'database is down');
sqlite> ^D
$ sqlite3 log.db "select msg from log" | grep down$ | wc -l
       3
$ sqlite3 log.db "select msg from log where msg like '%down'" | grep down$ | wc -l
       3