RODBC::sqlQuery 检测隐藏字符

RODBC::sqlQuery detecting hidden characters

我在使用 RODBC 查询 Oracle 数据库时遇到隐藏字符的问题。首先是我的代码:

library(RODBC)
con <- odbcConect('dsn', uid = 'user', pwd = 'pass')
query <- read_file('Query.sql')
query <- gsub('\n', ' ',gsub('\t', ' ',gsub('\r' ,' ', query)))

我在这里使用 gsub 手动删除我在 sql 文件中识别的三个隐藏字符。

df <- sqlQuery(con, query = query)

这将返回两个错误的列表。

[1] "HY000 911 [Oracle][ODBC][Ora]ORA-00911: invalid character\n" 

[2] "[RODBC] ERROR: Could not SQLExecDirect...

最初我是将此查询从 Outlook 复制并粘贴到一个文本文件中。然后我重新输入了整个内容,希望能摆脱隐藏的字符。现在我正在使用一串 gsubs 手动删除隐藏字符,但我仍然收到错误消息。查看 'query' 向量,我没有看到任何隐藏的字符,所以我不确定问题出在哪里。

我读到 RODBC 可能难以在 SQL 查询中进行聚合,但此查询仅对更高级别的关键字使用 LEFT JOIN、CASE 和 WHERE。

感谢任何帮助。

也许使用 base:iconv() 将所有内容都转换为 ASCII。

如果查询本身有错误字符,我会从一个简单的 SELECT 一列查询开始;从一个新的文本文件开始,您知道其中的编码表现良好。确保查询在 Oracle Developer(或不依赖于 R 的东西)中有效。然后确保 RODBC 连接适用于该简单查询。

假设您必须使用并非从头开始编写的 sql 个文件,您可能希望朝这个方向努力。

content   <- readr::read_file("Query.sql")
cleaned   <- base::iconv(x=content, from="latin1", to="ASCII//TRANSLIT", sub="&")

if( grepl("&", cleaned) ) {
  cat(cleaned)
  stop("The query might contain non-ASCII characters with no good non-ASCII equivalent.  Check the console for the '&' substitution character.")
}

con <- odbcConect('dsn', uid = 'user', pwd = 'pass')
df  <- sqlQuery(con, query = returned_value)

当可能存在不良字符时,我会在上面抛出一个错误,因为可能不清楚应该用什么来替换它。

即使这不是您最终想要的解决方案,将所有内容都压缩为 ASCII 也可以帮助证实您的怀疑。另外,考虑使用 Notepad++ 或 Atom 来显示非打印字符,例如 .