如何防止SQLite将字符串视为数字?

如何防止SQLite将字符串视为数字?,第1张

概述我想查询包含目录路径的SQLite表,以查找某些层次结构下的所有路径.以下是该列内容的示例: /alpha/papa//alpha/papa/tango//alpha/quebec//bravo/papa//bravo/papa/uniform//charlie/quebec/tango/ 如果我搜索/ bravo / papa /下的所有内容,我想得到: /bravo/papa//b 我想查询包含目录路径的sqlite表,以查找某些层次结构下的所有路径.以下是该列内容的示例:

/Alpha/papa//Alpha/papa/tango//Alpha/quebec//bravo/papa//bravo/papa/uniform//charlIE/quebec/tango/

如果我搜索/ bravo / papa /下的所有内容,我想得到:

/bravo/papa//bravo/papa/uniform/

我目前正在尝试这样做(请参阅下面的长篇故事,说明为什么我不能使用更简单的方法):

SELECT * FROM files WHERE Path >= '/bravo/papa/' AND Path < '/bravo/papa0';

这有效.它看起来有点奇怪,但它适用于这个例子. ‘0’是大于’/’的unicode代码点1.按字典顺序排序时,以’/ bravo / papa /’开头的所有路径都比它大于’bravo / papa0′.但是,在我的测试中,当我们尝试这个时,我发现这会崩溃:

SELECT * FROM files WHERE Path >= '/' AND Path < '0';

这不会返回任何结果,但应返回每一行.据我所知,问题是sqlite将’0’视为数字,而不是字符串.例如,如果我使用’0Z’而不是’0′,我会得到结果,但我会产生误报的风险. (例如,如果实际上有一个条目’0′.)

我的问题的简单版本是:有没有办法让sqlite在这样的查询中将’0’视为包含unicode字符’0’的长度为1的字符串(它应该排序诸如’!’,’*之类的字符串) ‘和’/’,但在’1′,’=’和’A’之前,而不是整数0(sqlite在所有字符串之前排序)?

我想在这种情况下,我可以通过特殊套管来搜索“/”下的所有内容,因为我的所有条目总是以’/’开头,但我真的想知道如何避免这种事情一般来说,因为它以与JavaScript的“==”运算符相同的方式令人不快地感到惊讶.

第一种方法

更自然的方法是使用liKE或GLOB运算符.例如:

SELECT * FROM files WHERE Path liKE @prefix || '%';

但我想支持所有有效的路径字符,因此我需要使用ESCAPE作为’_’和’%’符号.显然,这可以防止sqlite在Path上使用索引. (参见http://www.sqlite.org/optoverview.html#like_opt)我真的希望能够从这里的索引中受益,并且听起来像使用liKE或GLOB是不可能的,除非我能保证它们的特殊字符都不会出现在目录名中,并且POSIX允许任何其他比Nul和’/’,甚至GLOB的’*’和’?’字符.

我是为上下文提供的.我对解决底层问题的其他方法感兴趣,但我更愿意接受一个直接解决sqlite中字符串 – 看起来像数字 – 的歧义的答案.

类似的问题

How do I prevent sqlite from evaluating a string as a math expression?

在那个问题中,没有引用这些值.即使在作为参数引用或传入值时,我也会得到这些结果.

编辑 – 请参阅下面的答案.该列是使用无效类型“STRING”创建的,sqlite将其视为NUMERIC.

解决方法 *呻吟*.该列具有NUMERIC亲和力,因为它意外地被指定为“STRING”而不是“TEXT”.由于sqlite无法识别类型名称,因此它使其成为NUMERIC,并且由于sqlite不强制执行列类型,因此其他所有内容都按预期工作,除非每次将类似数字的字符串插入该列时它都会转换为数字类型. 总结

以上是内存溢出为你收集整理的如何防止SQLite将字符串视为数字?全部内容,希望文章能够帮你解决如何防止SQLite将字符串视为数字?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1155381.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存