我有一个Sqlite3(v3.8.7.1 2014-10-29)数据库,其中包含一个包含本地安装软件包名称的表,包括版本,安装日期,软件主页URL等详细信息。
现在出现了一个问题,其中一个软件包(CPAN模块"版本")恰好与其中一个表列相同,即"版本"。
在一个表的最简单的测试用例中"包"
name | version
----------+-----------
delete | 2.2.5
replace | 1.2.5
search | 3.1
version | 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",希望永远不会与可能的包名字符串冲突?
答案 0 :(得分:2)
重复
我在搜索可能的答案时错过了。
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