如果没有找到匹配的列,SQLite(显然是作为一个“兼容特性”)会将双引号标识符解析为字符串文字。
我知道它这样做是为了那些编写不正确sql的人,以及与这些人创建的遗留项目的向后兼容性,但它使我们这些在全新项目上编写正确sql的人调试起来非常困难。
例如,
SELECT * FROM "users" WHERE "usernme" = 'joe';
返回0行的查询,因为字符串'usernme'不等于字符串'joe'。
这让我挠头,想知道为什么我没有得到joe的行,即使我知道有一个用户的名字,直到我煞费苦心地回溯我的代码,并意识到我遗漏了一个a。
是否有任何“严格模式”PRAGMA或API选项来强制执行引用规则,并将所有双引号字符串视为标识符,以便在拼写错误时立即通知我?
(And请不要告诉我如果不需要就不要引用标识符,因为任何这样的答案基本上都是在告诉我,为了获得正确的调试,首先必须编写糟糕的代码。)
3条答案
按热度按时间blpfk2vs1#
这在SQLite解析器中是硬编码的,不能从外部更改。
1tu0hz3e2#
我还在SQLite频道询问过,那里有人好心地浏览了源代码并创建了一个补丁,甚至在邮件列表上开始了一个描述补丁的线程:
http://www.mail-archive.com/sqlite-users@sqlite.org/msg73832.html
这不是一个适用于官方版本的答案,但有一天可能会。目前,我只是打算用这个补丁重新编译它。
kfgdxczn3#
10年后,这并不完全符合您对“严格模式”之类的东西的标准,但如果您记得使用它,我会使用以下技巧来使某些查询更安全:为您的表提供一个别名并引用它:
我想在这种形式中,SQLite很清楚不需要文字。