有些人已经报告过,带引号的字符串中的分号会导致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;
答案 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支持字符串中的分号并且是免费的(但还有其他一些小缺点)。
我发布这个答案是因为我在搜索引擎时很容易找到了这个问题,但我没有轻易找到答案。祝所有遇到此事的人好运。
其他可能有用的问题:
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();
?>
这将允许您插入带有特殊字符的记录。