我试图在select
中运行一个简单的sqlite3
命令并获得奇怪的结果。我想搜索一列并显示其中包含字符串dockerhosts
的所有行。但结果显示其中没有dockerhosts
字符串的行。
例如搜索dockerhosts
:
sqlite> SELECT command FROM history WHERE command like '%dockerhosts%' ORDER BY id DESC limit 50;
git status
git add --all v1 v2
git status
如果我从最后删除s
我得到了我需要的东西:
sqlite> SELECT command FROM history WHERE command like '%dockerhost%' ORDER BY id DESC limit 50;
git checkout -b hotfix/collapse-else-if-in-dockerhost
vi opt/dockerhosts/Docker
aws s3 cp dockerhosts.json s3://xxxxx/dockerhosts.json --profile dev
aws s3 cp dockerhosts.json s3://xxxxx/dockerhosts.json --profile dev
history | grep dockerhost | grep prod
history | grep dockerhosts.json
我错过了什么?
答案 0 :(得分:4)
我在这里看到一个注释,LIKE模式有可配置的限制 - sqlite.org/limits.html ... 10似乎很短但可能就是你遇到的。
默认LIKE和GLOB中使用的模式匹配算法 SQLite的实现可以表现出O(N²)性能(其中N是 对于某些病理病例,模式中的字符数)。 避免恶意攻击者的拒绝服务攻击 指定自己的LIKE或GLOB模式,LIKE的长度或 GLOB模式仅限于SQLITE_MAX_LIKE_PATTERN_LENGTH个字节。该 这个限制的默认值是50000.现代工作站可以 甚至评估50000字节的病态LIKE或GLOB模式 相对较快。拒绝服务问题只会发挥作用 当模式长度达到数百万字节时。尽管如此, 因为大多数有用的LIKE或GLOB模式最多只有几十个字节 在长度上,偏执应用程序开发人员可能希望减少这一点 参数到几百的范围内,如果他们知道的话 外部用户能够生成任意模式。
LIKE或GLOB模式的最大长度可以降低为 运行时使用 sqlite3_limit(db,SQLITE_LIMIT_LIKE_PATTERN_LENGTH,size)接口。