Where子句搜索所有内容,如果它最后有字符`s`

时间:2017-04-19 14:38:42

标签: sql sqlite

我试图在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

我错过了什么?

1 个答案:

答案 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)接口。