当列名包含撇号时出现“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时出现无效列名错误