SQL 服务器和 SQLite 'LIKE' 函数之间的区别

Difference between SQL Server and SQLite 'LIKE' function

我正在使用两个数据库,一个是 MS SQL Server,另一个是 SQLite。两者都包含我可以并且已经验证过的相同数据(至少,它们与不同语言所允许的相同)。在使用这两种语言时,我发现两种语言的执行方式存在令人困惑的差异:

当我 运行 在 SQL 服务器中进行以下查询时:

SELECT
    count(*)
FROM
    Pattern as p
WHERE
    'RK69M|1M116849' like replace(p.Keys, '*', '_') + '%'

我得到: 47040

但是当我 运行 SQLite 中的等效查询(唯一的区别是 SQL 服务器中的串联是 + 但 SQLite 使用||):

SELECT 
count(*)
FROM
    Pattern as p
WHERE
    'RK69M|1M116849' like replace(p.Keys, '*', '_') || '%'

我得到:43197

谁能解释一下?他们使用不同的正则表达式进行匹配吗?

如果重要,在两者中,table(删除 where 子句)中的记录数是 1304884

我也尝试过运行通过多种渠道(TSQL、python、基于 GUI 的查询工具等)进行查询,并且都得到了相同的结果。 我还使用 python 脚本测试了数据以比较它们,并将它们转储到文本文件并在 linux 中使用 diff 命令,因此我相信每个脚本中的数据都是相同的数据库。

[In SQL Server] I get: 47040
[In Sqlite] I get: 43197
Can anyone explain this? Do they use different regex's for matching?

它根本不是正则表达式。 LIKE是它自己的东西。但是像这类问题的常见情况一样,我们可以通过查看文档来获得洞察力。

Here is SQL Server's LIKE operator documentation

来自 SQL 服务器的相关部分描述了四种不同的模式匹配标记:%_[][^ ]

Here is Sqlite's documentation
(向下滚动到第 5 部分)

相关部分仅描述了前两个模式标记:%_

这两个数据库的文档都包含有关转义字符等其他信息,这些信息在您的查询中未使用,但 Sqlite 文档包含以下内容:

The LIKE operator is case sensitive by default for unicode characters that are beyond the ASCII range.

我不知道你的数据的性质,也不知道这在这里是否重要,但我可以说 SQL 服务器对同一问题的处理取决于排序规则,因此不一定相同.


重点是两个数据库引擎在这方面的行为方式存在差异,因此如果提供重要数据,您应该会得到一些不同的结果。