4

我有一个 SQLite (v3.8.7.1 2014-10-29) 数据库,其中包含一个包含本地安装软件包名称的表,包括版本详细信息、安装日期、软件主页 URL 等。

现在问题出现了,其中一个包(CPAN 模块“版本”)恰好与表列之一具有相同的名称,即“版本”。

在表“包”的最简单的测试用例中

姓名 版本
删除 2.2.5
代替 1.2.5
搜索 3.1
版本 0.2.3
echo 'SELECT * FROM Packages where name = "replace" ;' | sqlite3 Test.db
replace|1.2.5
echo 'SELECT * FROM Packages WHERE name = "search" ;' | sqlite3 Test.db
search|3.1

但是当试图检索名为“版本”的包的条目时,

echo 'SELECT * FROM Packages WHERE name = "version" ;' | sqlite3 Test.db

没有返回任何内容,因为它可能正在尝试将名称与“版本”列中的值进行比较。

有没有办法强制进行文字字符串比较,或者避免此类问题的唯一解决方案是将列从“版本”重命名为其他名称,例如“package_version”,希望它永远不会与可能的包名称字符串发生冲突?

4

1 回答 1

4

这与中的问题相同

sqlite SELECT 在查询列中与该列同名的值时返回所有记录

在搜索可能的答案时我错过了。

Sky Sanders 的解决方案是在字符串值周围使用单引号。

echo "SELECT * FROM Packages WHERE name = 'version' ;" | sqlite3 Test.db

显式单引号可防止 shell 变量的扩展,因此可以通过使用扩展为单引号的 shell 变量来解决这个问题,即

name="version"
quote="'"
table="Packages"

echo "SELECT * FROM ${table} WHERE name = ${quote}${name}${quote} ;" | sqlite3 Test.db
于 2017-04-16T01:10:49.023 回答