包含分号的SQL语句导致错误

包含分号的SQL语句导致错误,sql,sqlite,Sql,Sqlite,一些人已经报告说,带引号的字符串中的分号可能导致SQL错误 我当前的设置是一个SQLite 3数据库,我正在尝试执行一个insert,我的一个新数据字段包含一些HTML,作为其中的一部分,我有以分号结尾的HTML实体,例如-è 我正在尝试的一个简单的简化示例查询如下: insert into my_table (some_field) values ('Hello; world'); 我得到的错误是: (一) (二) 因此,SQL引擎显然在Hello中看到了分号;世界,并将其解释为

一些人已经报告说,带引号的字符串中的分号可能导致SQL错误

我当前的设置是一个SQLite 3数据库,我正在尝试执行一个insert,我的一个新数据字段包含一些HTML,作为其中的一部分,我有以分号结尾的HTML实体,例如-
è

我正在尝试的一个简单的简化示例查询如下:

insert into my_table (some_field) values ('Hello; world');
我得到的错误是:

(一)

(二)

因此,SQL引擎显然在
Hello中看到了分号;世界
,并将其解释为语句的结尾。我已经请其他一些人对此进行了测试,有些人在使用SQLite GUI时发现,这让我相信这只是一个需要更改的SQL设置

似乎至少在默认情况下,SQL引擎只在语句末尾使用分号,有人知道如何更改吗

非常奇怪,请尝试以下查询:

DROP TABLE IF EXISTS djp;
CREATE Table djp ("mykey" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" VARCHAR(25));
INSERT INTO djp (name) VALUES ('This is test two; OK?');
SELECT * FROM djp;
请注意,如果我插入时没有指定要插入的字段(使我的自动增量有点无意义),则不会发生错误

INSERT INTO djp VALUES (1, 'This is test two; OK?');

我相信您只需要在SQL语句的末尾告诉SQLite您的转义字符是什么。例如:

SELECT * FROM MyTable WHERE RevenueChange LIKE '%0\%' ESCAPE '\'
LIKE将匹配30%、140%等值,我认为您使用的是
PHP
对吗?为什么不使用

使用PDO扩展的示例:

<?php

    $name = 'one';
    $value = 1;

    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $value);

    $stmt->execute();

?>


这将允许您插入带有特殊字符的记录。

如注释中所述,我在独立的
sqlite3.exe
引擎中运行了您的代码示例,它将像任何其他文本一样执行(带或不带分号)。既然您指出了
INSERT-INTO-Foo-VALUES()
INSERT-INTO-Foo(column)VALUES()
的怪癖,我同意这不是您的代码的问题,而是Navicat的一个bug

正如Sam在回答中提到的,问题是SQLite编辑器,而不是SQLite本身。在这个问题中,问题出在Navicat上(注:现在从10.1.2开始修补)。我遇到了同样的问题,但对我来说,SqlQuery也是同样的问题

我一直在努力解决这个问题,直到我意识到许多免费的SQLite客户端/编辑器都不支持字符串中的分号

我最终发现它支持字符串中的分号,并且是免费的(但还有一些其他的小缺点)

我之所以发布这个答案,是因为我在搜索引擎时很容易找到这个问题,但我没有那么容易找到答案。祝遇到这种情况的人好运

其他可能有帮助的问题:


记住,问题不在于SQLite!:)

使用独立的
sqlite3.exe
,插入带有分号的单引号字符串没有问题。您试图从哪种语言运行此代码?现在我正在使用Navicat对我的SQLite db执行查询。出于好奇,
“这是测试二;好吗?”
更好吗?不,不好,真正有趣的是,当我指定要更新的字段时,这会导致问题,所以
插入到djp值(…)
可以,但只更新name字段:
插入到djp(name)值('hello;world')
会产生问题。这很奇怪。您是否尝试过更新问题中的示例SQL?请做…太好了,也许这只是一只有虫子的Navicat。谢谢你的帮助。看起来Navicat有一个bug,我将向他们报告我没有使用PHP,谢谢你的回答,我使用的是SQLite,实际上我正在从命令行和SQLite GUI(Navicat)运行我的查询-请查看我的更新问题和导致问题的示例表。注意Navicat发布了一个更新(10.1.2)“这就解决了这个问题,”丹尼尔更新了答案,让更多的人知道这一点。谢谢
SELECT * FROM MyTable WHERE RevenueChange LIKE '%0\%' ESCAPE '\'
<?php

    $name = 'one';
    $value = 1;

    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $value);

    $stmt->execute();

?>