【问题标题】:"column" IS NOT NULL in query does not throw error when column does not exist当列不存在时,查询中的“列” IS NOT NULL 不会引发错误
【发布时间】:2012-12-05 13:01:22
【问题描述】:

在我的 PHP 单元测试中,我使用的是 SQLite 内存数据库,其中包含下表:

CREATE TABLE "battlegroup_request" (
  "id" INTEGER NULL PRIMARY KEY AUTOINCREMENT,
  "battlegroupID" INTEGER NULL,
  "inviterID" INTEGER NULL,
  "inviteeID" INTEGER NULL
)

当我使用两个整数绑定执行以下查询时;

SELECT *
FROM "battlegroup_request"
WHERE "inviteeid" = ? AND
  "inviter" IS NOT NULL AND
  "battlegroupid" = ?
LIMIT 1

查询返回一个结果,但我希望它会引发错误,因为 inviter 列不存在。这是 SQLite 的预期行为吗?我做错了吗?

我使用的是PDO,连接创建如下:

new PDO(
    'sqlite::memory:',
    null,
    null,
    array(
        PDO::ATTR_CASE => PDO::CASE_LOWER,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
        PDO::ATTR_STRINGIFY_FETCHES => false,
        PDO::ATTR_EMULATE_PREPARES => false,
    )
);

(这些选项是Laravel 的默认选项,也就是我们正在使用的框架。)

【问题讨论】:

    标签: php sqlite laravel notnull


    【解决方案1】:

    如果你使用类似的东西:

    SELECT "inviter" IS NOT NULL FROM battlegroup_request
    

    如果列 inviter 不存在,它将返回 TRUE,因为 SQLite 会将 "inviter" 视为简单的字符串值(这里肯定不是 NULL)。

    但是,如果你去掉双引号:

    SELECT inviter IS NOT NULL FROM battlegroup_request
    

    如果列 inviter 不存在,则会引发异常。

    编辑:使用反引号还会强制 SQLite 将其视为名称(不是字符串):

    SELECT `inviter` IS NOT NULL FROM battlegroup_request
    

    如果列 inviter 不存在,将引发异常。

    【讨论】:

    • 我不这么认为,不是在 SQLite 方面。您可能需要查看 Laravel 文档。如果我是你,我会修补框架以不转义表和/或列名,如果它们真的不需要转义(不包含空格等)。
    • 好的,谢谢。我已经修补了框架以使用 SQLite 的反引号,这似乎按预期工作。这可能不是最佳实践,但它是一个很好的解决方法,直到他们在 SQLite 本身中将其设为可选。
    • 很高兴它对你有用。我将更新我的答案以提及反引号
    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多