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 服务器对同一问题的处理取决于排序规则,因此不一定相同.
重点是两个数据库引擎在这方面的行为方式存在差异,因此如果提供重要数据,您应该会得到一些不同的结果。
我正在使用两个数据库,一个是 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 服务器对同一问题的处理取决于排序规则,因此不一定相同.
重点是两个数据库引擎在这方面的行为方式存在差异,因此如果提供重要数据,您应该会得到一些不同的结果。