7

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

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

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

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

我得到的错误是:

1)

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

2)

world')
Error : near "world": syntax error

因此,SQL 引擎显然看到了分号Hello; world并将其解释为语句的结尾。我已经请其他几个人对此进行了测试,并且有些人在使用 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?');
4

3 回答 3

2

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

于 2012-09-04T23:04:52.687 回答
1

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

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

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

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

其他可能有帮助的问题:

Mac SQLite 编辑器

什么是好的开源 GUI SQLite 数据库管理器?

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

于 2013-01-18T04:58:35.213 回答
0

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

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

LIKE 将匹配 30%、140% 等值。我认为您使用的PHP正确吗?为什么不使用PDOMYSQLI

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

?>

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

于 2012-09-04T22:34:15.537 回答