2

在我的 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的默认选项,也就是我们正在使用的框架。)

4

1 回答 1

4

如果你使用类似的东西:

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如果列不存在,将引发异常。

于 2012-12-18T10:53:05.050 回答