当列名包含撇号时出现“UcanaccessSQLException:意外标记”

Posted

技术标签:

【中文标题】当列名包含撇号时出现“UcanaccessSQLException:意外标记”【英文标题】:"UcanaccessSQLException: unexpected token" when column name contains apostrophe 【发布时间】:2015-02-25 22:38:51 【问题描述】:

我正在将现有程序从 JDBC-ODBC Bridge 转换为 UCanAccess。它已经工作了多年。 Java 程序写入一个 MDB 文件。转换后,一个插入命令停止工作。 它抛出“net.ucanaccess.jdbc.UcanaccessSQLException:意外令牌:[”。

经过一些实验,我确定问题是由名称中包含撇号的三列引起的。示例:[预定的采购订单放置日期]。显然 JDBC-ODBC 桥不在乎,但 UCanAccess 不在乎。

我有点被现有的 MDB 结构所困,或者我只是重命名这些字段。但是,如果我这样做,不知道有多少下游报告会被破坏。 MDB 用于临时报告。

这是一个简化的 SQL Select 版本的问题。它会引发与插入相同的错误。

    String cJD = "net.ucanaccess.jdbc.UcanaccessDriver";
    String cS = "jdbc:ucanaccess://C:/MosAll/mosall.mdb";
    String uid = "";
    String pw = "";
    String sql4 =   "select [Sched'd PO Place Date] from [Tier 1] ";

    Class.forName(cJD);
    Connection con = DriverManager.getConnection(cS, uid, pw);
    PreparedStatement pstmt4;
    pstmt4 = con.prepareStatement(sql4);
    pstmt4.execute();

有没有办法“转义”撇号或重新配置 ucanaccess 以便驱动程序可以执行它们?

【问题讨论】:

【参考方案1】:

此问题已在 UCanAccess 2.0.9.4 中修复。


上一个答案:

我已经能够使用 UCanAccess 版本 2.0.9.3 重新创建问题。

select [Sched'd PO Place Date] ...

失败,但现在只是省略'

select [Schedd PO Place Date] ...

工作正常。有趣的是,使用反引号而不是方括号

select `Sched'd PO Place Date` ...

也会产生异常

net.ucanaccess.jdbc.UcanaccessSQLException:意外令牌:[

如果幸运的话,这将在 UCanAccess 的未来版本中得到修复。

【讨论】:

是的,这只是规范化 SQL 的解析器中的一个错误。使用列内部名称(没有撇号的名称)一切正常,但我将在下一个版本中修复它。反引号被视为方括号:它们也受 access 支持,并且在 ucanaccess 中引入它们主要是为了实现 DatabaseMetaData.getIdentifierQuoteString 方法,这对于 openoffice 或 libreoffice 等工具很有用。 —— 删除撇号有效,这是一个不错的解决方法。谢谢!我从没想过要尝试。 唯一剩下的就是我收到了这条消息: - 不支持的数据类型 BINARY 用于索引,设为只读。知道如何消除这个吗?如果您愿意,我可以将其作为一个单独的问题重新发布。我在网上看到了同样问题的一些答案,但我无法具体将这些答案与我正在做的事情联系起来。 这是一个愚蠢的警告,所以我认为他们可以比我更好地帮助你。 谢谢大家。你很有帮助!我会向 Jackcess 提出最后一个问题。【参考方案2】:

你试过表、列名在``之间(它们不是撇号,而是~旁边的那个),\'可能会起作用,最后JDBC标准方法是在查询末尾定义转义字符:

String sql4 = "select [Sched\'d PO Place Date] from [Tier 1]  escape '\'"

您可能还想尝试使用 `` 而不是 []

最后,你的最后一个资源是“select *”并自己提取正确的列

【讨论】:

这会引发错误:net.ucanaccess.jdbc.UcanaccessSQLException:意外令牌:

以上是关于当列名包含撇号时出现“UcanaccessSQLException:意外标记”的主要内容,如果未能解决你的问题,请参考以下文章

当查询包含撇号时,NSFetchRequest 会触发 NSInvalidArgumentException

尝试子查询时出现不明确的列名错误

执行查询时出现“选择列表中的列名无效”错误

将pandas DataFrame写入sql时出现无效列名错误

mysql - 使用关键字作为列名时出现错误 1064 (42000)

忽略包含中的撇号