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 来显示非打印字符,例如 .
我在使用 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 来显示非打印字符,例如 .