【问题标题】:RODBC::sqlQuery detecting hidden charactersRODBC::sqlQuery 检测隐藏字符
【发布时间】:2018-06-21 05:29:02
【问题描述】:

在使用 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 手动删除隐藏字符,但我仍然收到错误消息。查看“查询”向量,我没有看到任何隐藏字符,所以我不确定问题出在哪里。

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

感谢任何帮助。

【问题讨论】:

  • 您的Query.sql 文件是否包含任何“智能引号”(如“these”)或不间断空格?
  • 没有找到

标签: r oracle rodbc


【解决方案1】:

也许使用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 来显示非打印字符,例如 https://stackoverflow.com/a/8523118/1082435

【讨论】:

  • 此时我仍在尝试将我的数据提取到数据框中。使用 Notepad++ 我已将 Query.sql 转换为 ASCII 并启用显示所有字符。我得到的唯一东西是 CF 和 LR。
  • 我误会了。我重写了代码以清理查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多