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

时间:2012-09-04 22:22:06

标签: sql sqlite

有些人已经报告过,带引号的字符串中的分号会导致SQL错误。

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

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

è

我得到的错误是:

1)

insert into my_table (some_field) values ('Hello; world');

2)

insert into my_table (some_field) values ('Hello
Error : unrecognized token: "'Hello"

因此,SQL引擎显然在world') Error : near "world": syntax error 中看到了分号,并将其解释为语句的结尾。我已经让其他几个人测试了这个,有些人在使用SQLite GUI时会发现它让我相信它只是一个需要改变的SQL设置。

似乎至少在默认情况下,SQL引擎只想在结尾语句中使用半冒号,有没有人知道如何更改它?

这很奇怪,请尝试以下查询:

Hello; world

请注意,如果我插入时未指定要插入的字段(使我的自动增量有点无意义),则不会发生错误...

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;

3 个答案:

答案 0 :(得分:2)

正如评论中所述,我在独立的sqlite3.exe引擎中运行了您的代码示例,并且执行任何其他文本(带或不带分号)。由于您使用INSERT INTO Foo VALUES ()INSERT INTO Foo (column) VALUES () quirk指出,我同意这不是您的代码的问题,这是Navicat的错误。

答案 1 :(得分:1)

正如Sam的回答中提到的,问题是SQLite编辑器,而不是SQLite本身。在这个问题的情况下,问题出在Navicat上(注意:现在已经修改了10.1.2)。我遇到了同样的问题,但对我来说,它与SqlQuery存在同样的问题。

我一直很努力,直到我意识到许多免费的SQLite客户端/编辑器在字符串支持中没有分号!

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

我发布这个答案是因为我在搜索引擎时很容易找到了这个问题,但我没有轻易找到答案。祝所有遇到此事的人好运。

其他可能有用的问题:

Mac SQLite editor

What are good open source GUI SQLite database managers?

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

答案 2 :(得分:0)

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

SELECT * FROM MyTable WHERE RevenueChange LIKE '%0\%' ESCAPE '\'

LIKE会匹配30%,140%等值。我认为你正在使用PHP吗?为什么不使用 PDO MYSQLI

使用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();

?>

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